假设我有一个名为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 articlethis one以获得更多详细信息。

09-05 15:49