一尘不染

Hibernate:删除所有懒惰集合的最佳实践

hibernate

我有的:

@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
}

有什么问题:

问题是,在会话关闭后,我无法拉动惰性收集。但是我也无法在 proceed 方法中关闭会话。

什么解决方案(粗略解决方案):

a)在会话关闭之前,强制hibernate以拉动惰性集合

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

....

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

题:

什么是最佳做法/常见方式/更轻松的方式?意味着将我的对象转换为JSON。


阅读 286

收藏
2020-06-20

共1个答案

一尘不染

Hibernate.initialize()在内部使用@Transactional初始化惰性对象。

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

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

entity.getAddresses().size();
entity.getPersons().size();
2020-06-20