2016-07-06 9 views
1

すべての関数でEntityManagerFactoryを作成して閉じる必要がありますか? 、またはアプリケーションの起動時に作成する必要がありますか?どうすればそれを達成できますか?例えばすべての関数のEntityManagerFactory?

私は2つの機能があります:アイテムのみを取得する機能が名前

private List<SomeItems> getItems() { 

    List<SomeItems> resultList = new ArrayList<SomeItems>(); 

    entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 
    entityManager = entityManagerFactory.createEntityManager(); 

    entityManager.getTransaction().begin(); 

    TypedQuery<SomeItems> query = entityManager.createQuery(
      "select n from SomeItems n", SomeItems.class); 

    resultList = query.getResultList(); 

    entityManager.getTransaction().commit(); 
    entityManager.close(); 
    entityManagerFactory.close(); 

    return resultList; 
} 

private List<String> getItemsName() { 
List<String> resultList = new ArrayList<String>(); 

entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 
entityManager = entityManagerFactory.createEntityManager(); 

entityManager.getTransaction().begin(); 

TypedQuery<String> query = entityManager.createQuery(
     "select n.name from SomeItems n", String.class); 

resultList = query.getResultList(); 

entityManager.getTransaction().commit(); 
entityManager.close(); 
entityManagerFactory.close(); 

return resultList; 
} 

どのようにすべきデータベースからオブジェクトを取得し

機能私はそれを改善する?

+0

JPAプロバイダのすべてのJPAドキュメントは、EMが安価である一方、EMFは作成するのに費用がかかると言及しています。あなたのプロバイダのドキュメントがそのことを言っていない場合、それらに問題を提起することを提案してください –

答えて

2

毎回EntityManagerFactoryを作成しても問題ありません。それは、とても(値段が)高いです。必要に応じて一度作成してください。 EntityManagerが複数回作成されても構いません。しかし、工場は全くない。あなたは、怠惰な、または熱心なタイプの初期化でシングルトンを使うことができます。あなたの電話。または、どこかの静的イニシャライザブロックのみ。多くのオプション。要点は、代わりに各コール再利用時にファクトリを作成することではありません。ここでは、実装例がベストではないかもしれないが、それはうまくいく。

class EntityManagerFactoryHolder { 
private static EnityManager entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase"); 

public EntityManagerFactory getEntityManager(){ 
    return entityManagerFactory; 
} 
} 

これはEAGER初期化を伴うシングルトンです。あなたがLAZYをインターネットで見たいと思ったら。

+0

いくつかのコードサンプルを渡せますか?後でそれを閉じるのはどうですか?どうすればそれを達成できますか? –

+0

エンティティマネージャに関してはtry {} finally {entityManager.close()} –

+0

でメソッドをラップすることができます。私は間違っているかもしれませんが、この行はどうですか? 'entityManagerFactory.close();'は必要ですか?いつ私はこれを置くべきですか? –

関連する問題