2011-01-31 17 views
2

皆さん、Java SEプロジェクトでJPAのEclipseリンクを使用しています。私はデータベース内の各テーブルに "jpa controller"クラスを使用しています(正しい方法です)。私はまた、 "jpaコントローラクラス"ごとにEntityManagerFactoryを提供していますので、entitymanagerを取得できます。プログラムが起動すると、AnalyzerPUのログインが2回成功したことが示されます。私は1つのEntityManagerFactoryだけを使うべきですか?それは私がそれを持っているすべての人がログインを示しているようです。私が続けると、データベースの各テーブルに1つずつ、12のログインがあります。私はこれが正しいことができないことを知っていますか?永続ユニットの複数のログイン?

public class PkgLineControllerImpl extends AbstractController implements PkgLineController { 

private EntityManagerFactory emf = null; 

public PkgLineControllerImpl() { 

    super(StateHistoryImpl.class); 
    emf = Persistence.createEntityManagerFactory("StateHistoryAnalyzerPU"); 
} 

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

@Override 
public List<PkgLine> findAll() { 
    EntityManager em = getEntityManager(); 

    List<PkgLine> pkgLineList = new ArrayList<PkgLine>(); 

    try { 
     pkgLineList = em.createNamedQuery("PkgLine.findAll").getResultList(); 
     return pkgLineList; 
    } finally { 
     em.close(); 
    } 
} 

}

これはI "mは私のコントローラをレイアウトする方法である。任意の助けてくれてありがとう。

時にはそれがこれを行います。

[EL Info]: 2011-02-01 14:34:07.991--ServerSession(18450577)--EclipseLink, version: Eclipse Persistence Services - 2.0.2.v20100323-r6872 
[EL Info]: 2011-02-01 14:34:08.381--ServerSession(18450577)--fileStateHistoryAnalyzerPU login successful 
100 
200 
100 
200 
100 
null 
null 
null 
null 
null 

時にはそれがこれを行います

Persistence Services - 2.0.2.v20100323-r6872 
[EL Info]: 2011-02-01 14:34:08.381--ServerSession(18450577)--fileStateHistoryAnalyzerPU login successful 
100 
200 
100 
200 
100 
Persistence Services - 2.0.2.v20100323-r6872 
[EL Info]: 2011-02-01 14:34:08.381--ServerSession(18450577)--fileStateHistoryAnalyzerPU login successful 
null 
null 
null 
null 
null 

nullはJPAControllerクラスのメソッドの1つで、いくつかのデータを返すもので、その番号はデータを返す他のJPAコントローラクラスです。私は1つのentitymanagerfactoryをAbstractClassに入れましたが、まだそれをやっています。

答えて

1

トランザクション/要求/セッションごとに1つのEntityManagerFactoryと1つのEntityManagerが必要です。また、すべてのクラスを含む永続ユニットを1つ用意する必要があります。

複数のファクトリを同一のパーシスタンスユニット名と引数なしで技術的に作成すると、同じパーシスタンスユニット、キャッシュ/接続プールを共有する必要がありますが、パーシスタンスユニットが異なる場合は、それぞれ独自のキャッシュ/

+0

私の投稿を更新しました。だから私が持っているすべてのメソッドにEntityManagerFactory "login"を持たせるのはいいですか? –

+0

複数のスレッドを使用していますか? 1つの永続ユニットに対してclose()を行わない限り、1つのログインのみを取得する必要があります。通常、EntityManagerFactoryを静的変数で管理して、1つしか存在しないようにする必要があります。 – James

+0

こんにちは、ありがとう。いいえ、私は複数のスレッドを使用していませんが、可能性があります。私は実際には1つのmanagerfactory(static final)を作成し、それをjpaコントローラクラスに渡してentitymanagersを作成しました。これは、マルチスレッドのアプリケーションでOKだろうか? –

関連する問題