Hibernate:拉取所有懒惰集合的最佳实践 [英] Hibernate: best practice to pull all lazy collections

查看:86
本文介绍了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>者;

....
}

public void handle(){

Session session = createNewSession();
MyEntity entity =(MyEntity)session.get(MyEntity.class,entityId);
继续(会话); // FLUSH,COMMIT,CLOSE会话!

Utils.objectToJson(entity); // TROUBLES,因为它不能转换成json懒惰集合
}

问题所在:



问题在于会话关闭后,我无法拉取懒惰集合。但是我也不能在 proceed 方法中关闭会话。 b
$ b

什么是解决方案(粗略解决方案): p> a)在session关闭之前,强制hibernate拉取懒惰的集合

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

....

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

问题:

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

使用 Hibernate.initialize()
解决方案>在 @Transactional 中初始化lazy对象。

  start事务
Hibernate.initialize(entity.getAddresses());
Hibernate.initialize(entity.getPersons());
结束事务

现在在事务处理的外面,您可以获得惰性对象。

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


What I have:

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

What a problem:

The problem is that I can't pull lazy collection after session has been closed. But I also can't not close a session in proceed method.

What a solution (coarse solution):

a) Before session is closed, force hibernate to pull lazy collections

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

....

b) Maybe more ellegant way is to use @Fetch(FetchMode.SUBSELECT) annotation

Question:

What is a best practice/common way/more ellegant way to do it? Means convert my object to JSON.

解决方案

Use Hibernate.initialize() within @Transactional to initialize lazy objects.

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

Now out side of the Transaction you are able to get lazy objects.

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

这篇关于Hibernate:拉取所有懒惰集合的最佳实践的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆