2012-04-02 9 views
1

私は初心者です。EJBとジャージー間のエンティティの状態

JerseyとEJBは同じEntityManagerスコープを保持していますか?

同じ永続コンテキストのEntityManagerをEJBに渡す必要がありますか?

主なターゲットの用途はJTAです。

@Stateless 
class MyEJB { 

    public MyEntity find(Long id) { 
     ... 
    } 

    @PersistenceContext; 
    EntityManager entityManager; 
} 


class MyResource { 

    @GET 
    @Path("/myentity/{id}"); 
    public MyEntity get(@PathParam("id") final long id) { 
     final MyEntity found = myEjb.find(id); 
     // is found's state detached? 

     // should I have to reattach? 
     found.setDate(new Date()); 

     return found; 
    } 

    @EJB 
    private MyEjb myEjb; 

    @PersistenceContext; 
    EntityManager entityManager; 
} 

答えて

1

んジャージーとEJBは同じEntityManagerのスコープを保持しますか?

同じ永続コンテキストのEntityManagerをEJBに渡す必要がありますか?

私はあなたの言葉が正しいとは思わないが、同じEntityManagerインスタンスを共有でき、正しい方法(インジェクションを通して)を選択した。 EntityManagerインスタンスを取得するには

、アプリケーションコンポーネントにエンティティマネージャを注入::のJava EE 6チュートリアルのthis chapterを見て

@PersistenceContext 
EntityManager em; 

だから、もう一度、あなたのアプローチがあります正しい。コードコメントの質問に関して:MyEntityがアタッチまたはデタッチされていることは、EJBのfindメソッドの実装に依存します。あなたは、次の操作を行う場合は、それが添付されます。

public MyEntity find(Long id) { 
    return entityManager.find(MyEntity.class, id); 
} 

を最後に、この方法をやって、あなたは、コンテナ管理トランザクションを使用するようにJTAを選択した場合、トランザクションは自動的にMyBeanの方法の自然境界で区切られます。 JTAトランザクションを使用するには、persistence.xmlファイル内でこの行を使用する必要があります。

<persistence-unit name="em" transaction-type="JTA"> 
関連する問題