【问题标题】:Using Entities in JSF在 JSF 中使用实体
【发布时间】:2012-04-11 11:31:21
【问题描述】:

我正在编写一个 Web 应用程序 (Tomcat 7),因此没有 JTA,并希望显示一个项目列表,包括与 JSF 页面中每个项目相关联的任务。

有 2 个实体 - 包含任务集合的项目。从我的托管 Bean 中,我调用一个便捷方法来检索所有活动的项目,然后迭代 (ui:repeat) 这个项目集合并希望显示每个项目的任务。当我尝试这样做时,我得到一个持久性异常,因为持久性上下文不再在范围内。

如果不创建项目和任务的支持 bean,并且不使用扩展上下文,我还有什么其他选择。

【问题讨论】:

    标签: java jsf jpa jsf-2 jpa-2.0


    【解决方案1】:

    经过更多的思考和研究,我回来正确地描述了我所处的情况,然后还提供了解决问题的方法。

    结果是项目实体具有指定为延迟加载的任务关系。 JPA 使用一个代理对象,该对象在请求获取数据之前等待对集合的请求。这成为一个问题,因为我们试图在持久性上下文分离实体之后访问信息。

    分辨率:

    触发延迟加载 - 当 Persistent Context 仍在范围内时,调用集合 getter 和您想要获取数据的任何其他方法,这会触发获取数据并添加实体。

    使获取类型 Eager - 查看使用延迟加载背后的原因并将获取类型更改为渴望。 "FetchType.EAGER"

    Fetch Joins - 添加关联作为 JP QL 的一部分,以便与查询一起获取。这优化了在一次调用中加载的查询和关联,同时仍然只返回一个实体。 "SELECT p FROM Project p LEFT JOIN FETCH p.tasks"

    希望这有助于下一个人找到解决问题的方法。

    【讨论】:

      【解决方案2】:

      您的便捷方法是否也获取任务,例如通过在查询中加入该关联?如果任务已经加载,JPA 将不需要在您访问集合时获取它们。

      编辑:JPA 2.0 specification 在第 4.4.5.3 节中写道:

      FETCH JOIN 允许获取关联或元素集合作为执行查询的副作用。

      获取连接的语法是

      fetch_join ::= [ LEFT [OUTER] | INNER ] JOIN FETCH join_association_path_expression
      

      FETCH JOIN 子句右侧引用的关联必须是从作为查询结果返回的实体或可嵌入对象引用的关联或元素集合。

      不允许为 FETCH JOIN 子句右侧引用的对象指定标识变量,因此对隐式获取的实体或元素的引用不能出现在查询的其他地方。

      以下查询返回一组部门。作为副作用,这些部门的关联员工也会被检索,即使他们不是显式查询结果的一部分。作为 fetch join 的结果检索到的对象的持久状态或关系字段或属性的初始化由该类的元数据确定 - 在本示例中,Employee 实体 类。

      SELECT d 
      FROM Department d LEFT JOIN FETCH d.employees
      WHERE d.deptno = 1
      

      获取连接与相应的内连接或外连接具有相同的连接语义,只是连接操作右侧指定的相关对象不会在查询结果中返回或在查询中以其他方式引用。因此,例如,如果部门 1 有五名员工,上述查询将返回对部门 1 实体的五个引用。

      FETCH JOIN 结构不得用于子查询的 FROM 子句中。

      【讨论】:

      • 如何编写查询以便 JPA 加载相关数据?现在我的查询只是“SELECT p FROM project p”。
      • 我的答案现在包括规范的相关部分,根据您的需要调整其中包含的示例应该很简单。
      • 太棒了,实际上只是在阅读这篇文章。谢谢你回来更新答案。
      【解决方案3】:

      手动打开EntityManager(使用工厂)并启动事务,然后提交并关闭实体管理器。

      但这不是一个好的选择 - 看看像 CDI、Seam 或 Spring 之类的东西来为您管理事务和会话(如果您不想使用 EJB3)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        相关资源
        最近更新 更多