我有
public class Customer(){
private List<OtherObject> otherObjectList;
...
}
如果我这样做,我从数据库中获取Customer对象
customerObject.getOtherObjectList().size()
它将发生LazyInitializationException
。没关系,有没有办法“断开”从数据库中检索到的对象?从数据库获取后,我想在没有调用LazyLoad功能的情况下使用customerObject.getOtherObjectList().size()
,并且不会发生错误LazyInitializationException
!
答案 0 :(得分:0)
在原始会话关闭之前,您需要通过调用Hibernate.initialize(customerObject.getOtherObjectList())来强制延迟初始化otherObjectList集合。然后,当您在会话外访问customerObject.getOtherObjectList()时,它已经被加载。
如果会话已关闭且您不知道是否发生延迟初始化,则可以通过调用Hibernate.isInitialized(customerObject.getOtherObjectList())来检查。那时,如果没有初始化,那么调用.size()是没有意义的。
答案 1 :(得分:0)
简单地说,你不能这样做。当你的集合是LAZY
时,会发生什么是hibernate创建代理而不是实际集合。一旦尝试通过getter方法访问该集合,代理对象就会执行查询以从DB获取真实集合(这称为初始化)。说过你不能自定义这个过程,即使你可以,也需要执行一个查询来获得大小,然而你需要一个开放的会话。