java - Hibernate:拉取所有惰性集合的最佳实践

标签 java hibernate lazy-loading

我有什么:

@Entity
public class MyEntity {
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
  @JoinColumn(name = "myentiy_id")
  private List<Address> addreses;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
  @JoinColumn(name = "myentiy_id")
  private List<Person> persons;

  //....
}

public void handle() {

   Session session = createNewSession();
   MyEntity entity = (MyEntity) session.get(MyEntity.class, entityId);
   proceed(session); // FLUSH, COMMIT, CLOSE session!

   Utils.objectToJson(entity); //TROUBLES, because it can't convert to json lazy collections
}

什么问题:

问题是 session 关闭后我无法提取惰性集合。但我也不能不关闭 proceed 方法中的 session 。

多么好的解决方案(粗略的解决方案):

a) 在 session 关闭之前,强制 hibernate 拉取惰性集合

entity.getAddresses().size();
entity.getPersons().size();

....

b) 也许更优雅的方法是使用 @Fetch(FetchMode.SUBSELECT) 注释

问题:

什么是最佳实践/常见方式/更优雅的方式?意味着将我的对象转换为 JSON。

最佳答案

@Transactional 中使用 Hibernate.initialize() 来初始化惰性对象。

 start Transaction 
      Hibernate.initialize(entity.getAddresses());
      Hibernate.initialize(entity.getPersons());
 end Transaction 

现在在 Transaction 之外,您可以获取惰性对象。

entity.getAddresses().size();
entity.getPersons().size();

关于java - Hibernate:拉取所有惰性集合的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19928568/

相关文章:

java - Hibernate 仅从数据库中检索第一条记录,其余为空

java - 使用复合键的 Hibernate 查找。列名无效异常

jquery - 带滚动条的 Kendo UI 网格的延迟加载

java - 使用 Maven 构建时 slf4j 版本冲突

hibernate - 从Grails中的一对多关系中查询项目列表

lazy-loading - 帮助处理 ActiveRecord 异常 "Failed to lazily initialize a collection - no session"

c# - 通过WCF服务的独立自跟踪实体的异步延迟加载导航属性?

java - 同步eclipse保存 Action 规则

java - 设置 MIDI 的速度

java - 获取文件的最后访问时间