2009-09-07 3 views
10

ご質問は申し訳ありませんが、JPA + Hibernateに問題がありますので、私の考えでは何かが明確ではないと考えました。 私はいくつかのエンティティを持っています、例えばA、B、C、Dと私はAMethods、BMethods、CMethods、DMethodsをコーディングしました。各*メソッドのクラスには、EntityManagerFactoryによるEntityManagerの初期化と、基本的にクエリを実行するメソッドが含まれています。シングルトンパターンを使用する必要があるかどうかはわかりません(つまり、*メソッドクラスごとにEntityManagerがある)か、クエリを実行するたびにEntityManagerを開いて閉じる必要があるか、エンティティを永続化/削除する必要があります。手伝って頂けますか??JPA EntityManager、どのように動作しますか?

答えて

7

JPA/Hibernateの典型的なアプリケーションでは、エンティティクラス自体に永続性ロジックを入れません。これは、古いEJB 2.xアプリケーションと比較して設計思想の大きな変化です。その代わり、多くのアプリケーションでは、EntityManagerインスタンスを使用してエンティティのクエリ、ロード、保存を行う、エンティティとは別のデータアクセスオブジェクトのレイヤを作成します。多くの場合、これらはシングルトンであり、DAO内のエンティティ・マネージャ・インスタンスはスレッドにとってローカルです。

Springのようなフレームワークを使用すると、EntityManagerインスタンスとトランザクションの管理は完全に自動化されます。 EJB 3と同じですが、大規模なプロジェクトでは使用していません。私は、Object-Relational Mappingデータアクセスに関するSpringのドキュメントの章を読むことをお勧めします。アプリケーションでSpringを使用することになっていなくても、永続性の懸念と永続化されているエンティティを分離したレイヤーでアプリケーションを構造化する方法に関するヒントを示します。がんばろう!

+0

私はSpringを使用せず、 (DAOは*メソッドクラスですが)すべて同じ永続コンテキストを使用しています。同じ永続コンテキストを使用していても、AMethodsとBMethodsでcreateEntityManagerをexecするのは正しいですか? – Raffo

2

EntityManagerは、永続コンテキストに関連付けられています。すべてのエンティティが1つのコンテキストに関連付けられている場合は、シングルトンパターンを使用します。 サーバー側でjpaを使用していますか?もしそうなら、サーブレットのinit()のようなinitメソッドでEntityManagerを初期化することができます。

+0

Iは同じ永続コンテキストを使用して、すべてのエンティティは、一つのコンテキストに関連付けられています。私はサーバー側でjpaを使用しますが、私はバックグラウンドで実行されているJavaアプリケーションでも使用しています...このアプリケーションでコンテキストを初期化し、*メソッドをEntityManagerをパラメータとして渡す必要がありますか? – Raffo

+0

はい、サービスとバックグラウンドアプリケーションが異なるアプリケーションの場合は、両方のEntityManagerを開始する必要があります。 EntityMaangerインスタンスをシリアル化するのは難しい作業だと思います。 – merin

+0

Springを使用して、Hibernateを使用してください。なぜEjbですか? – merin

-1

このように!

パブリックインターフェイス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 
} 

}