假设我有一个名为Foo
且具有String myStr
属性的JPA实体;
现在,当我像这样定义无状态会话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()
中所做的更改是否会保留? 最佳答案
只要您在同一事务中对getFoo(...)
和changeMyStr(...)
进行调用,对Foo
实例的更改就应该持久化(如果已提交该事务)。实体通常在离开事务后就变得分离,因此,如果在一个事务中调用getFoo(...)
而在另一事务中调用changeMyStr(...)
,则在changeMyStr(...)
内部进行的更改(以及在原始事务外部进行的任何其他更改)将不会保留。
如果使用extended persistence context,则在离开原始事务时实体将不会分离,但这是一种非常不寻常的情况。阅读this article或this one以获得更多详细信息。