2

タイトルが示すように、Web アプリケーションで Apache Struts2 と JPA Eclipselink を使用しています。そこにいくつかの編集オプションがあり、それらのほとんどが 1 つのアクションと 1 つの 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();

だから、私の質問は次のとおりです。このアプローチは推奨されますか? 問題なく動作しているようですが、私が気付いていない、より優れた、より信頼性の高い解決策があるかもしれません。これについてどう思いますか?

4

1 に答える 1

1

かなり長い間開かれたトランザクションを保存するのは良い考えではないと思います。

セッションにエンティティのみを保存し、最後のステップの後にトランザクション全体を実行します。

または、各ステップの後にデータを保持しますが、それぞれが別のトランザクションになります。

于 2015-05-19T19:45:33.420 に答える