我正在使用JBoss 6.1.0.Final,JSF 2.0.3,EJB3和JPA 2 + Hibernate 3.3开发一个项目。
JSF页面显示了一个输入实体A数据的表单,同时它还有一个与该实体A相关联的B,C和D实体列表。其中一个列表在加载表单时显示一个是抛出LazyInitializationException,因为没有会话或会话已关闭。
经过一番SO&谷歌浏览我尝试了一些答案,以及一个模式,以保持EntityManager在视图中,但没有一个足够。 Spring有一个org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor似乎处理这种情况AFAIK但我可能是错的。
执行访问列表的任何方法时抛出异常:
IA entityA = business.getListOfAs();// In AListBean
然后,在我做的表格上:
entityA.getListofB(); //LazyInitializationException
我在获取A记录后不会访问列表,中间有一些导航会导致会话在我获取B项列表之前关闭。
重新附加A的分离实例可以解决问题,但我不知道如何在不合并对象(持久对其进行任何更改)并将获取类型设置为 eager 的情况下执行此操作不是一种选择。
是否可以通过任何方式以惰性方式访问A中的B,C和D实体列表?
答案 0 :(得分:1)
如果A与其Session分离,您可以单独加载B集合并通过其Setter设置它,如果您不想重新附加它。
在使用gui事件访问集合之前,单独加载集合并通过setter进行设置。
使用HQL或标准API(例如:
)将集合加载到EJB中public List<B> getBsByA(int aId);
在JSF托管bean中使用属性和连接到gui事件的更新方法,如:
private A selectedA;
//Directly setting collection in selectedA should make this obsolete.
private List<B> bsOfSelA;
public void updateBsOfSelectedA()
{
this.bsOfSelA = business.getBsByA(this.selectedA.getId())
//this.selA.setBs(business.getBsByA(this.selectedA.getId()))
}