Hibernate LazyInitializationException在JSF表单中列出对象时出现异常

Hibernate LazyInitializationException在JSF表单中列出对象时出现异常,hibernate,jsf-2,ejb-3.0,jpa-2.0,Hibernate,Jsf 2,Ejb 3.0,Jpa 2.0,我正在使用JBoss6.1.0.Final、JSF2.0.3、EJB3和JPA2+Hibernate3.3进行一个项目 JSF页面显示一个表单来输入实体A的数据,同时它还有一个与该实体A关联的B、C和D实体的列表。其中一个列表在加载表单时显示,另一个是引发LazyInitializationException的列表,因为没有会话或会话已关闭 在浏览了一些SO&Google之后,我尝试了一些答案,并尝试了一种模式来保持EntityManager在视图中,但这些都不够。Spring有一个org.sp

我正在使用JBoss6.1.0.Final、JSF2.0.3、EJB3和JPA2+Hibernate3.3进行一个项目

JSF页面显示一个表单来输入实体A的数据,同时它还有一个与该实体A关联的B、C和D实体的列表。其中一个列表在加载表单时显示,另一个是引发LazyInitializationException的列表,因为没有会话或会话已关闭

在浏览了一些SO&Google之后,我尝试了一些答案,并尝试了一种模式来保持EntityManager在视图中,但这些都不够。Spring有一个org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor,似乎可以很好地处理这种情况,但我可能错了

执行访问列表的任何方法时引发异常:

IA entityA = business.getListOfAs();// In AListBean
然后,在我做的表格上:

entityA.getListofB(); //LazyInitializationException

我在获取A记录时不访问列表,中间有一些导航,导致在我获取B项列表之前关闭会话。

重新附加已分离的实例可以解决问题,但我不知道如何在不合并对象(保留对其所做的任何更改)和将获取类型设置为“渴望”的情况下完成此操作


有没有办法以惰性方式访问A中的B、C和D实体列表?

如果A从其会话中分离,您可以单独加载B集合,如果不想重新附加它,可以通过其Setter对其进行设置

在使用gui事件访问集合之前,分别加载集合并通过setter进行设置

使用HQL或类似以下API的标准在EJB中加载集合:

public List<B> getBsByA(int aId);
公共列表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()))
}
private A selectedA;
//直接在selectedA中设置集合应该会使其过时。
SELA的私人名单;
public void updateBsOfSelectedA()
{
this.bsOfSelA=business.getBsByA(this.selectedA.getId())
//this.selA.setBs(business.getBsByA(this.selectedA.getId())
}

猜得好,我自己也在考虑如何管理对象之间的关系,因为我缺少了“使用setter”这一点。现在您已经提到了,如果实体有一个ID,那么在保存A时应该保持关系。您的答案似乎是一张好票!我会试试,然后公布结果。果然很有魅力。谢谢你的提示。