web-dev-qa-db-ja.com

EntityManagerを取得するさまざまな方法

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コンテナを使用しない環境について話しています。

ありがとう。

31
jayjay

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

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

EntityManagerFactory factory = 
  Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

エンタープライズアプリケーションでは、コンテナがコンテナを作成できるようにするで、必要に応じて挿入します。

EntityManagerは、JDBC接続の単なるラッパーです。非常に軽量であり、パフォーマンスを低下させることなく作成および破棄できます。

EntityManagerはスレッドセーフではないため、インスタンスが1つある場合は、アクセスを同期する必要がある場合があることに注意してください。詳細については、 transaction basics をご覧ください。


私がそれを行う方法は次のとおりです(おおよそ)。

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を使用できます。

16
Mansour

今日、おそらくEntityManagerを管理するためのspring-dataや@PersistanceUnitのようなものを見るべきです。

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

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

Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

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

1
Klaus Groenbaek