我有一个从休眠会话中获得的类的示例。那次会议早就过去了。现在,我正在调用toString()
,我得到了预期的LazyInitializationException: could not initialize proxy - no Session
,因为我正在尝试访问Hibernate在示例加载(惰性加载)过程中未解析的引用。
我真的不想让加载变得急切,因为它会将查询从大约120个字符更改为超过4KB(具有8个连接)。而且我不必这样做:我希望在toString()
中显示的只是被引用对象的ID;也就是说,在这个时间点上Hibernate需要知道的东西(否则它不能执行延迟加载)。
所以我的问题是:你是如何处理这起案件的?永远不要尝试在toString()
中使用引用?还是在加载代码中调用toString()
以防万一?或者,Hibernate中有没有一些实用函数,当我传递给它一个可能是惰性的引用时,它会返回一些有用的东西?或者,您是否完全避免在toString()
中引用?
4条答案
按热度按时间hmtdttj41#
可以通过将ID字段的accesstype设置为“Property”来实现这一点。比如:
它解释了here。这样,在创建代理时,始终填充id字段。
fgw7neuy2#
我找到了一种解决方法:
所以这段代码所做的就是从对象中获取ID(一个64位数字)。
DBObject
是定义long id()
的接口。如果对象是Hibernate代理,那么我与它的LazyInitializer
对话以获取ID。否则,我调用id()
。用途:jhkqcmku3#
我发现最符合良好实践的方法是对本博客上的解决方案进行修改:http://www.nonfunc.com/2016/02/05/jpa-performance-gotcha-tostring-really/。它需要对可为空的字段和集合对象进行修改。
0pizxfdo4#
如果您想要返回的只是对象的ID,我设想调用getID(),然后在您想要显示它的时刻将int/long解析为字符串值就可以了。至少根据这个问题看起来是这样的。
How to solve the LazyInitializationException using JPA and Hibernate
在查看了评论并进行了一些搜索之后,我相信这可能对您的场景最有利。