没有exec lazyload的对象从JPA / Hibernate中检索

时间:2014-02-04 23:23:16

标签: java hibernate jpa

我有

public class Customer(){

  private List<OtherObject> otherObjectList;
  ...
}

如果我这样做,我从数据库中获取Customer对象

   customerObject.getOtherObjectList().size()

它将发生LazyInitializationException。没关系,有没有办法“断开”从数据库中检索到的对象?从数据库获取后,我想在没有调用LazyLoad功能的情况下使用customerObject.getOtherObjectList().size(),并且不会发生错误LazyInitializationException

2 个答案:

答案 0 :(得分:0)

在原始会话关闭之前,您需要通过调用Hibernate.initialize(customerObject.getOtherObjectList())来强制延迟初始化otherObjectList集合。然后,当您在会话外访问customerObject.getOtherObjectList()时,它已经被加载。

如果会话已关闭且您不知道是否发生延迟初始化,则可以通过调用Hibernate.isInitialized(customerObject.getOtherObjectList())来检查。那时,如果没有初始化,那么调用.size()是没有意义的。

答案 1 :(得分:0)

简单地说,你不能这样做。当你的集合是LAZY时,会发生什么是hibernate创建代理而不是实际集合。一旦尝试通过getter方法访问该集合,代理对象就会执行查询以从DB获取真实集合(这称为初始化)。说过你不能自定义这个过程,即使你可以,也需要执行一个查询来获得大小,然而你需要一个开放的会话。