0

更新

好的,经过多年的编程,如果您使用会话范围的表单和延迟加载和延迟提交,我发现自己缺乏如何在您的 web 应用程序中正确使用 JPA 的知识。

案例如下:

  1. Web 应用程序表单一旦打开就会生成并保持会话范围,直到显式关闭或会话被销毁。因此,对同一个表单的多个 get 请求只会呈现表单本身。
  2. 表单允许用户查看/编辑同一根的 bean 或 bean 的层次结构(例如,User、UserDocuments[] 和 UserSecurityGroup,最后两个是从 User 引用的)。
  3. 可以从根对象的一种形式打开子对象。子对象存储在与根对象相同的事务中(em.persist(rootObject);使用Cascade.ALL)。
  4. 可以取消以根/子形式进行的更改,直到后者关闭。
  5. 表单上的组件可以使用延迟加载来引用子对象。
  6. 组件具有自定义(可配置)逻辑(OnClick、OnChange、OnLoad 等),并且可以引用(读取或修改)已编辑 bean 的最新修改版本。

根据 TomEE 站点http://tomee.apache.org/jpa-concepts.html的简要说明,不能在 webapp 中使用 JTA 持久性,因此,鉴于延迟加载仅在打开持久性上下文时才有效,之前应该做所有延迟加载的事情em.close()。如果我使用请求范围的 EntityManager,这一事实使我无法实现第 3 点和第 6 点。我可以通过在会话级别移动 EntityManager 来解决它,但是如果这样做,我将无法满足第 4 点 - 已经对子对象进行了更改,在表单关闭后仍然管理对象。如果我将 EntityManager 移动到表单范围,应用程序将成为 jdbc 资源密集型(或不是?实体管理器是否创建到数据库的连接?,并且 OpenJPA 设置位于http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/ref_guide_dbsetup_retain)。

我还有什么其他选择?

4

2 回答 2

0

好吧,我在某种程度上解决了这个问题。如果我以可以将草稿条目存储在表格中的方式修改第 3 点,那么这个问题就不再是问题,这大大简化了整个解决方案。

不过,我很高兴看到来自社区的其他想法 :)

于 2013-07-18T06:06:11.640 回答
0

如果您使用的是 EclipseLink,则在关闭持久性上下文后允许访问 LAZY 关系。

于 2013-07-17T13:37:33.780 回答