0

我正在开发一个使用 JBoss 6.1.0.Final、JSF 2.0.3、EJB3 和 JPA 2 + Hibernate 3.3 的项目。

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

经过一些 SO & Google 浏览后,我尝试了一些答案,以及将 EntityManager 保留在视图中的模式,但这些都不够。Spring 有一个 org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor 似乎可以处理这种情况 AFAIK 但我可能是错的。

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

IA entityA = business.getListOfAs();// In AListBean

然后,在我做的表格上:

entityA.getListofB(); //LazyInitializationException

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

重新附加 A 的分离实例可以解决问题,但我不知道如何在不合并对象(保留对其所做的任何更改)并将获取类型设置为渴望的情况下做到这一点。

是否有任何方法可以以惰性方法访问 A 中的 B、C 和 D 实体列表?

4

1 回答 1

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()))
}
于 2012-05-22T00:38:47.230 回答