JPA:无状态会话bean和托管实体

时间:2013-04-03 21:47:32

标签: java java-ee jpa ejb

假设我有一个名为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()中所做的更改是否会保留?

1 个答案:

答案 0 :(得分:4)

只要您对getFoo(...)changeMyStr(...)的调用是在同一事务中进行的,如果提交了该事务,则Foo实例的更改应该保持不变。离开事务后,实体通常会分离,因此如果您在一个事务中调用getFoo(...)而在另一个事务中调用changeMyStr(...),则在changeMyStr(...)内进行更改(以及在原始事务之外进行的任何其他更改)将保留。

如果您使用extended persistence context,实体将在离开原始交易时分离,但这是一个相当不寻常的情况。有关详细信息,请阅读this articlethis one