【发布时间】:2009-11-12 13:01:06
【问题描述】:
我有一个从 Hibernate 会话中获得的类的实例。那个会议早就过去了。现在,我正在调用 toString() 并得到预期的 LazyInitializationException: could not initialize proxy - no Session,因为我正在尝试访问 Hibernate 在加载实例期间未解析的引用(延迟加载)。
我真的不想让加载变得急切,因为它会将查询从大约 120 个字符更改为超过 4KB(有 8 个连接)。而且我不必:我只想在toString() 中显示被引用对象的ID;即 Hibernate 在这个时间点需要知道的东西(或者它无法进行延迟加载)。
所以我的问题是:你如何处理这个案子?永远不要尝试在toString() 中使用引用?或者您是否在加载代码中调用toString() 以防万一?或者 Hibernate 中是否有一些实用函数,当我向它传递一个 可能 是惰性的引用时,它会返回一些有用的东西?还是您完全避免在toString() 中引用?
【问题讨论】:
-
如果 Java 有闭包,你可以这样做: String x = lazyToString({ => this.getY() }) + lazyToString({ => this.getZ() });并在lazyToString 方法中捕捉到期望。内部类(或 try/catch)的开销太高,无法做到这一点。
-
是的,但这也不会给我一个会话。
-
没错。您不仅可以打印该值未加载。我以为这就是意图。您将无法启动会话并在 toString 方法调用上关联对象。
-
我的意思是这些信息必须在某处可用(请参阅下面的答案):)
标签: hibernate lazy-loading tostring