ご質問は申し訳ありませんが、JPA + Hibernateに問題がありますので、私の考えでは何かが明確ではないと考えました。 私はいくつかのエンティティを持っています、例えばA、B、C、Dと私はAMethods、BMethods、CMethods、DMethodsをコーディングしました。各*メソッドのクラスには、EntityManagerFactoryによるEntityManagerの初期化と、基本的にクエリを実行するメソッドが含まれています。シングルトンパターンを使用する必要があるかどうかはわかりません(つまり、*メソッドクラスごとにEntityManagerがある)か、クエリを実行するたびにEntityManagerを開いて閉じる必要があるか、エンティティを永続化/削除する必要があります。手伝って頂けますか??JPA EntityManager、どのように動作しますか?
答えて
JPA/Hibernateの典型的なアプリケーションでは、エンティティクラス自体に永続性ロジックを入れません。これは、古いEJB 2.xアプリケーションと比較して設計思想の大きな変化です。その代わり、多くのアプリケーションでは、EntityManagerインスタンスを使用してエンティティのクエリ、ロード、保存を行う、エンティティとは別のデータアクセスオブジェクトのレイヤを作成します。多くの場合、これらはシングルトンであり、DAO内のエンティティ・マネージャ・インスタンスはスレッドにとってローカルです。
Springのようなフレームワークを使用すると、EntityManagerインスタンスとトランザクションの管理は完全に自動化されます。 EJB 3と同じですが、大規模なプロジェクトでは使用していません。私は、Object-Relational Mappingデータアクセスに関するSpringのドキュメントの章を読むことをお勧めします。アプリケーションでSpringを使用することになっていなくても、永続性の懸念と永続化されているエンティティを分離したレイヤーでアプリケーションを構造化する方法に関するヒントを示します。がんばろう!
EntityManagerは、永続コンテキストに関連付けられています。すべてのエンティティが1つのコンテキストに関連付けられている場合は、シングルトンパターンを使用します。 サーバー側でjpaを使用していますか?もしそうなら、サーブレットのinit()のようなinitメソッドでEntityManagerを初期化することができます。
Iは同じ永続コンテキストを使用して、すべてのエンティティは、一つのコンテキストに関連付けられています。私はサーバー側でjpaを使用しますが、私はバックグラウンドで実行されているJavaアプリケーションでも使用しています...このアプリケーションでコンテキストを初期化し、*メソッドをEntityManagerをパラメータとして渡す必要がありますか? – Raffo
はい、サービスとバックグラウンドアプリケーションが異なるアプリケーションの場合は、両方のEntityManagerを開始する必要があります。 EntityMaangerインスタンスをシリアル化するのは難しい作業だと思います。 – merin
Springを使用して、Hibernateを使用してください。なぜEjbですか? – merin
このように!
パブリックインターフェイスProtokollDAOService {
/**
* Fügt ein Protokollobjekt in die Datenbank hinzu.
*
* @param object
*/
public void addProtokoll (ProtokollModel object);
/**
* Läd aus einer Datenbank Protokoll-Elemente und fügt sie in eine Liste hinzu
*
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokolls();
/**
* Liefert ein Protokoll-Element aus der Datenbank anhand der ID;
*
* @param id
* @return ProtokollModel Protokoll-Element
*/
public ProtokollModel getProtokollById (long id);
/**
* Liefert eine Liste von Protokoll-Elementen anhand des Problem-Status
*
* @param solved
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByProblemStatus (boolean solved);
/**
* Liefert eine Liste von Protokoll-Elementen anhand des Aufgaben-Status
*
* @param ready
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByAufgabenStatus (boolean ready);
/**
* Liefert ein Protokoll-Element anhand des Problems
*
* @param problem
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByProblem (String problem);
/**
* Liefert ein Protokoll-Element anhand der Aufgabe
*
* @param aufgabe
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByAufgabe (String aufgabe);
/**
* Ausgabe der Protokoll-Tabelle
*
*/
public void printTable();
}
ProtokollDAOImplはProtokollDAOServiceを実装パブリッククラス{ プライベート静的最終列PERSISTENCE_UNIT_NAME = "ProtokollManager"。 プライベートEntityManagerFactory entityFactory;
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#addProtokoll(model.ProtokollModel)
*/
public void addProtokoll(ProtokollModel object) {
try
{
entityFactory = Persistence
.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = entityFactory.createEntityManager();
// Transaction starten
em.getTransaction().begin();
// Object zum speichern
em.persist(object);
// commit senden an die DB/Transaction abschliessen
em.getTransaction().commit();
// DB connection schliessen
em.close();
}
catch (Exception e)
{
Logger.console("Exception wurde ausgelösst! " + e);
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByAufgabe(java.lang.String)
*/
public List<ProtokollModel> getProtokollByAufgabe(String aufgabe) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByAufgabenStatus(boolean)
*/
public List<ProtokollModel> getProtokollByAufgabenStatus(boolean ready) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollById(long)
*/
public ProtokollModel getProtokollById(long id) {
try
{
entityFactory = Persistence
.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = entityFactory.createEntityManager();
// Transaction starten
em.getTransaction().begin();
// Object aus der DB laden
Query q = em.createQuery("select m from ProtokollModel m where m.id=:id");
// Parameter setzen - siehe PreparedStatment
q.setParameter("id", id);
// liefert das Protokoll-Element zurück
ProtokollModel pm = (ProtokollModel) q.getSingleResult();
// commit senden an die DB/Transaction abschliessen
em.getTransaction().commit();
// db connection schliessen
em.close();
return pm;
}
catch (Exception e)
{
Logger.console("Exception wurde ausgelösst! " + e);
e.printStackTrace();
} finally {
}
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByProblem(java.lang.String)
*/
public List<ProtokollModel> getProtokollByProblem(String problem) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByProblemStatus(boolean)
*/
public List<ProtokollModel> getProtokollByProblemStatus(boolean solved) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokolls()
*/
public List<ProtokollModel> getProtokolls() {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#printTable()
*/
public void printTable() {
// TODO Auto-generated method stub
}
}
私はSpringを使用せず、 (DAOは*メソッドクラスですが)すべて同じ永続コンテキストを使用しています。同じ永続コンテキストを使用していても、AMethodsとBMethodsでcreateEntityManagerをexecするのは正しいですか? – Raffo