Struts2 + JPA:如何正确编辑/更新实体跨行动?

时间:2015-05-15 20:03:23

标签: jsp jpa struts2 struts-action

正如标题所示,我在我的Web应用程序中使用Apache Struts2和JPA Eclipselink。让我们说我有几个编辑选项,其中大多数只包含一个操作和一个JSP页面。在那种情况下,我正在做的方法是显而易见的:

EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager em = emfactory.createEntityManager();
em.getTransaction().begin();
Entity entity = em.find( Entity.class, this.id );

entity.setName("Test");

entitymanager.getTransaction().commit();
entitymanager.close();
emfactory.close();

但是,有一个更复杂的编辑选项跨越4个不同的JSP页面(甚至更多的操作)。我使用的方法是将EntityManager和EntityTransaction对象存储在会话对象中(在第一个编辑操作上),然后在最后一个中检索它,以完成事务。像这样:

1。第一次编辑操作:

EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );
em = emfactory.createEntityManager();
et = em.getTransaction();
et.begin();

this.session.put("em", em);
this.session.put("et", et);

2。上次修改操作:

em = (EntityManager) session.get("em");
et = (EntityTransaction) session.get("et");

entity.setName("Test");

et.commit();
em.close();

所以,我的问题是:推荐这种方法吗?它似乎工作正常,但也许有一个更好,更可靠的解决方案,我不知道。 你对此有何看法?

1 个答案:

答案 0 :(得分:1)

我认为存储交易的时间相当长,这不是一个好主意。

我只在会话中存储实体,并在最后一步之后执行整个事务。

或者在每个步骤后保留您的数据,但每个步骤都在一个单独的事务中。