Struts 1.3 + JPA(永続化プロバイダとしてのHibernateを使用)を使用して、簡単な "Book Store"プロジェクトを開発しています。私はSpringや他のより洗練された開発環境(Jbossなど)に切り替えることができず、Hibernate特有の技術(例えば、Session
クラス)を使用することはできません。JSEでJPAを使用したEntityManager ThreadLocalパターン
私がJSE環境にいるという事実を考えると、EntityManagerのライフサイクル全体を明示的に管理する必要があります。
次のようにBook
エンティティが定義されています
@Entity
public class Book {
@Id private String isbn;
private String title;
private Date publishDate;
// Getters and Setters
}
私は、すべての書籍のインスタンスを取得し、そのISBNによって単一本のインスタンスを取得し、取り外した本をマージするの、それぞれ担当している3つのAction
クラスを、定義されましたDBに格納する。
ビジネスロジックコードとデータアクセスコードの間の懸念の分離を高めるために、私はCRUD操作を実行するための単なるBookDAO
オブジェクトを導入しました。理想的には、すべてのデータアクセスに関連するコールをパーシスタンスレイヤーに委任する必要があります。
public class ListBookAction extends Action {
private BookDAO dao = new BookDAO();
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// Retrieve all the books
List<Book> books = dao.findAll();
// Save the result set
request.setAttribute("books", books);
// Forward to the view
return mapping.findForward("booklist");
}
}
BookDAOオブジェクトは、任意の操作を行うためにEntityManager
インスタンスにアクセスする必要がある:たとえば、次のようにListBookAction
が定義されます。 EntityManger
はスレッドセーフではないことを考えると、私はThreadLocal
変数内EntityManagerをカプセル化しBookUnitSession
という名前のヘルパークラスを導入しました:
public class BookUnitSession {
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("BookStoreUnit");
private static final ThreadLocal<EntityManager> tl = new ThreadLocal<EntityManager>();
public static EntityManager getEntityManager() {
EntityManager em = tl.get();
if (em == null) {
em = emf.createEntityManager();
tl.set(em);
}
return em;
}
}
すべてが動作しているようですが、私はまだいくつかの懸念を持っています。すなわち:
- このソリューションは、最も適していますか?この場合のベストプラクティスはどれですか?
- 私はまだEntityManagerとEntityManagerFactoryの両方を明示的に閉じる必要があります。どうやってやるの?私は可能な解決策を設計し、最後の数日間の間に
おかげ
いい仕事ですが、おそらくJSEではなくJEEを意味します。 –
ありがとうございます。私は現在、アプリケーションサーバーなしでTomcat 7とStruts 1.3を使用しています。したがって、私は完全にJEEに準拠しているとは言えません。永続性の観点からは、JSE環境にいるようなものです。だからこそ、私はJSEをタイトルに挙げました。 –
こんにちは、このソリューションは最後にうまくいったのですか? ThreadLocalの使用に関するいくつかの問題について聞いたことがあります。 –