34

EntityManager を作成するために私が目にする通常のイディオムは、次のようなものです。

public class BaseDao {
    private static final String PERSISTENCE_UNIT_NAME = "Employee";

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

    public EntityManager getEntityManager() {
      return factory.createEntityManager();
    } 
}

次に、次のように使用されます。

Employee emp = new Employee();
emp.setName("Joe M");
getEntityManager().persist(emp);

問題は、なぜこのようにしないのかということです:

public class BaseDao{
    private static final String PERSISTENCE_UNIT_NAME = "Employee";
    EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    private EntityManager entityManager = null;


public void setEntityManger() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    this.entityManager = factory.createEntityManager();

    }

    public EntityManager getEntityManager() {
        return this.entityManager;
    }
}

つまり、常にエンティティ マネージャを通過させる必要があるのfactory.createEntityManager()でしょうか。または、インスタンス (または静的) 変数として作成し、そのように取得できますか?

明確にするために、EJB または Spring コンテナーを使用しない環境について話しています。

ありがとう。

4

2 に答える 2

19

インスタンスを作成する方法EntityManagerは 2 つあります。

1 つの方法は SDK アプリケーション用で、私は単体テストでこの方法をよく使用します。これはあなたの例にあるものです:

EntityManagerFactory factory = 
  Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

エンタープライズ アプリケーションでは、コンテナにそれらを作成させ、必要に応じて注入します。

EntityManagerJDBC 接続の単なるラッパーです。非常に軽量で、パフォーマンスを犠牲にすることなく作成および破棄できます。

はスレッド セーフではないことEntityManagerに注意してください。そのため、インスタンスが 1 つある場合は、そのインスタンスへのアクセスを同期する必要がある場合があります。詳細については、トランザクションの基本を参照してください。


これが私がそれを行う方法です(大まかに):

public class BaseDao{
  private static final String PERSISTENCE_UNIT_NAME = "Employee";
  private static EntityManagerFactory factory = 
    Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

  public void create(MyEntiy person){
    EntityManager em = factory.createEntityManager();
    em.getTransaction().begin();
    // do what ever you need 
    em.getTransaction().commit();
    em.close();
  }

  // add more methods to the dao.
}

このプロトタイプを作成して準備ができたら、汎用 DAO を使用できます。

于 2012-06-24T01:12:53.367 に答える
1

今日、EntityManager を管理するために、おそらく spring-data や @PersistanceUnit などを検討する必要があります。

EntityManager は単なるラッパーではなく、JDBC 接続のラッパーです。パーシスタンス コンテキストのスコープを定義します。これは、トランザクションがコミットされたとき (クエリをデータベースにフラッシュするとき) に実行する必要がある作業単位を定義します。永続コンテキスト内では、データベース内の特定のエンティティが、直接ロードするか、別のエンティティの OneToMany 関係を介してアクセスするかに関係なく、結果として同じ Java オブジェクトになることも保証されます。

スプリング以外の設定で EntityManagerFactory を取得することに関する元の質問に関して。あなたは単に呼び出す

Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

このメソッドは静的ファクトリ メソッドであり、JPA 実装に応じて、同じ PU に対して同じインスタンスを取得するか、基礎となる永続セッション (PU ごとに 1 つ) をラップする浅い​​ラッパーを取得します。

于 2016-11-24T11:49:12.650 に答える