2016-05-09 11 views
0

ステートレスBeanに注入されたEntityManagerのライフサイクルを説明できる人はいますか?ステートレスBeanに注入されたEntityManagerが特定のPersistenceContextに関連付けられている場合、Beanが2度目に使用されたときに、その関連付けはどうなりますか?ステートレスBeanで注入されたEntityManagerの有効範囲/ライフサイクル

refreshStepsは、Beanが(2番目のトランザクション)が使用されている二度目と呼ばれる
@Stateless 
public class TimeStepsBean 
{  
    @PersistenceContext(unitName="DynamicDB") 
    private EntityManager em;  

    public List<TimeStep> timeSteps = new ArrayList<TimeStep>(); 

    private void init() 
    { 
     if (timeSteps.isEmpty()) 
     { 
      TypedQuery<TimeStep> query = em.createQuery("SELECT t FROM TimeStep t", TimeStep.class); 
      timeSteps = query.getResultList();. 
     } 
    } 

    public void refreshSteps() 
    { 
     init(); 
     em.flush(); 
     em.refresh(timeSteps.get(0));    
    } 
} 

は、私が手:

例えば、私は以下の持っている「java.lang.IllegalArgumentExceptionがを:エンティティが管理していません」 。 entityManagerが注入されたので、それは常に現在の永続コンテキストの一部であると仮定しています。本当?

リフレッシュの前にem.merge(timeSteps.get(0))を追加すると、同じ例外が生成されます。

+0

コンテナは、プロキシEntityManagerを挿入します。トランザクション内にいない場合、このプロキシは各呼び出しに対して新しいEntityManagerを取得する可能性が高いため、次回の呼び出し時にem.find(x.class)が決して管理されません。 – Chris

+0

これを見て、それはあなたを助けることができます:http://stackoverflow.com/questions/2070073/entitymanager-refresh-problem。 – JMSilla

+0

新しいトランザクションが開始され、新しいエンティティマネージャがプロキシに対して生成され、そのエンティティマネージャがトランザクション全体で使用されている場合、 – RunningCrazy28

答えて

0

あなたの時間ステップは状態です。あなたのクラスはステートレスとしてアノテーションされています。それはフレームワークの悪用です。

関連する問題