【问题标题】:Struts2 + JPA: how to correctly edit/update entity accross actions?Struts2 + JPA:如何正确编辑/更新跨动作的实体?
【发布时间】:2015-07-27 20:52:36
【问题描述】:

正如标题所示,我在我的 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();

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

【问题讨论】:

  • 不要将它存储在会话中,恕我直言,最好使用会话管理工具。
  • 你能详细说明一下吗?在快速搜索该主题后,我只能得出结论,您可能指的是拦截器,对吗?我怎样才能做到这一点?
  • 您说您将它们存储在会话中并且它对您有用,您还想要什么?如果您有特定问题,请在此处编辑您的帖子,好与不好主要是基于意见和离题。
  • 众所周知,“它有效”并不意味着它是推荐的、优雅(甚至)安全的解决方案。由于您在第一条评论中提到了替代方案,因此我希望您可以对此进行扩展,因为我自己无法弄清楚。

标签: jsp jpa struts2 struts-action


【解决方案1】:

我认为存储一个打开了很长时间的事务,这不是一个好主意。

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

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

【讨论】:

  • 非常感谢,我需要这个答案才能点击并完全意识到我不必开始交易进行之前更改实体的实例。
  • 我收回它:它只在我使用相同的EntityTransaction 对象调用begin()commit() 时才有效,所以我必须将它存储在某个地方并以某种方式将它传递到最后操作,其中正在调用 commit()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多