2012-04-02 45 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實例,並且你選擇了正確的方式(通過注入)。因此,再次

@PersistenceContext 
EntityManager em; 

,你的做法是:看看在Java EE 6教程的this chapter

爲了獲得一個EntityManager實例,注入實體管理器到應用程序組件正確。關於代碼註釋中的問題:MyEntity已連接或分離,這取決於您的EJB中查找方法的實現。如果你做到以下幾點,將附:

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

最後,這樣一來,如果你選擇了JTA使用容器管理的事務,該交易將自動爲MyBean的方法自然邊界爲界。爲了有JTA交易,您必須在persistence.xml文件中使用此行:

<persistence-unit name="em" transaction-type="JTA">