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