在您的webapp中使用JPA的正确方法?

时间:2013-07-17 08:25:10

标签: web-applications jpa

更新

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

案例如下:

  1. Web应用程序表单在打开后生成,并保持会话范围,直到显式关闭或会话被销毁。因此,对同一表单的多个get请求只会呈现表单本身。
  2. 表单允许用户查看/编辑同一根bean的Bean或层次结构(例如,User,UserDocuments []和UserSecurityGroup,最后两个从User引用。)
  3. 可以从根对象的形式打开子对象。子对象存储在与根对象相同的事务中(em.persist(rootObject);使用Cascade.ALL)。
  4. 可以取消对root / children表单所做的更改,直到后者关闭。
  5. 表单上的组件可以使用延迟加载来引用子对象。
  6. 组件具有自定义(可配置)逻辑(OnClick,OnChange,OnLoad等),可以引用(读取或修改)已编辑bean的最新修改版本。
  7. 根据TomEE网站http://tomee.apache.org/jpa-concepts.html的简要说明,人们不能在webapp中使用JTA持久性,因此,鉴于延迟加载仅在打开持久性上下文时才会起作用,所以应该进行所有延迟加载em.close()之前的东西。如果我使用请求范围的EntityManager,这个事实阻止我实现第3点和第6点。我可以通过在会话级别移动EntityManager来解决它,但是如果我这样做,我就无法满足第4点 - 已经对子对象进行了更改,对象在表单关闭后仍然被管理。如果我将EntityManager移动到表单范围,应用程序将变为jdbc资源密集型(或不是Does an entity manager create a connection to the database?,以及http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/ref_guide_dbsetup_retain处的OpenJPA设置。)

    我还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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