2013-04-03 81 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