我有的:
@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)注释
@Fetch(FetchMode.SUBSELECT)
题:
什么是最佳做法/常见方式/更轻松的方式?意味着将我的对象转换为JSON。
Hibernate.initialize()在内部使用@Transactional初始化惰性对象。
Hibernate.initialize()
@Transactional
start Transaction Hibernate.initialize(entity.getAddresses()); Hibernate.initialize(entity.getPersons()); end Transaction
现在,在Transaction之外,您可以获取惰性对象。