Struts 1.3 + JPA (永続化プロバイダーとして Hibernate を使用) を使用して、単純な「Book Store」プロジェクトを開発しています。Spring やその他のより洗練された開発環境 (Jboss など) に切り替えることができず、Hibernate 固有の手法 (Session
クラスなど) を使用することもできません。
私が JSE 環境にいるという事実を考えると、EntityManager のライフサイクル全体を明示的に管理する必要があります。
エンティティは次のBook
ように定義されます。
@Entity
public class Book {
@Id private String isbn;
private String title;
private Date publishDate;
// Getters and Setters
}
私は 3 つのAction
クラスを定義しました。これらのクラスはそれぞれ、すべての書籍インスタンスの取得、ISBN による単一の書籍インスタンスの取得、および分離された書籍の DB へのマージを担当します。
ビジネス ロジック コードとデータ アクセス コードの間の関心の分離を強化するために、BookDAO
CRUD 操作の実行を担当する単純なオブジェクトを導入しました。理想的には、すべてのデータ アクセス関連の呼び出しを永続化レイヤーに委任する必要があります。たとえば、ListBookAction
は次のように定義されます。
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
、操作を行うためにインスタンスにアクセスする必要があります。EntityManger
これはスレッドセーフではないため、変数内に EntityManager をカプセル化するという名前のヘルパー クラスを導入しましたBookUnitSession
。ThreadLocal
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 の両方を明示的に閉じる必要があります。どうやってやるの?
ありがとう