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

时间:2012-05-21 23:18:36

标签: hibernate jsf-2 ejb-3.0 jpa-2.0

我正在使用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实体列表?

1 个答案:

答案 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()))
}