【问题标题】:LazyInitializationException while listing objects in a JSF form在 JSF 表单中列出对象时出现 LazyInitializationException
【发布时间】:2012-05-21 23:18:35
【问题描述】:

我正在开发一个使用 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 的分离实例可以解决问题,但我不知道如何在不合并对象(保留对其所做的任何更改)并将获取类型设置为 eager 的情况下做到这一点不是一个选项。

有什么方法可以惰性访问 A 中的 B、C 和 D 实体列表吗?

【问题讨论】:

    标签: hibernate jsf-2 ejb-3.0 jpa-2.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()))
    }
    

    【讨论】:

    • 不错,我自己管理对象之间的关系,因为我错过了一点“使用setter”。既然您提到它,如果实体具有 ID,则在保存 A 时应保留关系。您的答案似乎是一张好票!我会尝试并发布结果。
    • 按预期工作就像一个魅力。谢谢你的提示。
    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2019-08-11
    • 2014-12-19
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多