在我们的J2EE应用程序中,我们使用EJB-3有状态bean来允许前端代码创建,修改和保存持久实体(通过JPA-2进行管理)。为什么我们必须在扩展的PersistenceContext中手动刷新()EntityManager?
它看起来是这样的:
@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
private MyEntity current;
public void create()
{
this.current = new MyEntity();
em.persist(this.current);
}
public void load(Long id)
{
this.current = em.find(MyEntity.class, id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void save()
{
em.flush();
}
}
非常重要,以避免太早提交,只有save()
方法是在一个事务中,所以如果我们调用create()
,我们插入没有在数据库中。
奇怪的是,在save()
方法中,我们必须调用em.flush()
才能真正击中数据库。事实上,我试过并发现我们也可以拨打em.isOpen()
或em.getFlushMode()
,以及任何与“时间相关”的东西。
我不明白这一点。由于save()
处于事务中,我认为在该方法结束时,事务将被提交,因此持久化实体管理器会自动刷新。为什么我必须手动刷新它?
感谢, 泽维尔
不需要'flush()'。 'joinTransaction()'应该足以在你的事务性方法中保存你的修改。 –