2013-04-03 84 views
0

讓我們假設我有一個名爲Foo的JPA實體,並具有String myStr屬性;JPA:無狀態會話bean和管理實體

當我現在定義一個無狀態會話bean是這樣的:

@Stateless 
@LocalBean 
public class FooBean { 

    @PersistenceContext(unitName="foo-pu") 
    private EntityManager em; 

    public Foo getFoo(int id) { 
     return em.find(Foo.class,id); 
    } 

    public void changeMyStr(Foo entity) { 
     entity.setMyStr("fooStr"); 
    } 

} 

changeMyStr()所做的更改成爲持久化了,如果我通過之前獲取的Foo對象通過getFoo()

回答

4

只要您對getFoo(...)changeMyStr(...)的調用是在同一個事務中進行的,如果該事務被提交,則對Foo實例的更改應該保留。如果您在一筆交易中調用getFoo(...),在另一筆交易中調用changeMyStr(...),則在changeMyStr(...)(以及在原始交易外進行的任何其他更改)內所做的更改將保留而不是

如果使用extended persistence context,實體將而不是在離開原始事務時變爲分離狀態,但這是一種相當不尋常的情況。請閱讀this articlethis one瞭解更多詳情。

+2

...默認情況下,StatelessSessionBean中的每個方法都發生在它自己的事務中。 – jahroy 2013-04-03 22:11:24

+0

謝謝你這個很好解釋的answere。我應該在'changeMyStr()'中調用'em.merge()'(實際上在我的具體情況下做了一些業務邏輯),還是應該使用'em.find()'來獲取方法內的實體。 – Paranaix 2013-04-03 22:12:09

+0

@Paranaix更正統的選擇是在更高層實現整個事務性業務邏輯。然後這個方法將在同一個事務*中調用'getFoo(...)','changeMyStr(...)'和其他數據訪問「原語」*。通過這種方式,您的實體不會分離,所有事情都可以按照意願去做。如果由於某種原因,這是不可行的,那麼使用'em.merge(...)'是一個合理的選擇。 – gpeche 2013-04-03 22:29:04