2010-09-15 63 views
2

我该如何强制EJB在每一个命令后都不刷新所有内容,我想做一个事务。我读过,这是以某种方式声明式完成的。但究竟如何? 在ejb 3.0中声明一个事务

 
@Stateless 
public class SomeBean{ 
@PersistenceContext 
EntityManager em; 
public void doSomeStuffAndThenFlushToTheDb(){ 
    em.persist(entity); 
    // it's flushed by now, I don't want that 
    em.persist(somethingElse); 
    // now I want to flush both 
    em.flush(); 
    } 
} 

+0

哪个db?如果你的数据库不支持事务(例如mysql中的myisam),可能会出现奇怪的结果 – 2013-09-20 20:55:00

+0

如果你想回滚当前事务,使用“@Resource SessionContext context”将SessionContext注入到bean中,并调用context.setRollbackOnly()来回滚。 – 2013-09-20 21:03:20

回答

0

嗨,我怎么能强迫EJB每一个命令后不冲水的一切,我想要做的交易。

首先,你不应该得到一个flush“每一个命令”,我确实惊讶的是,你得到的persistflush。你是否显示了所有的代码?其次,EJB方法默认进行处理。但是交易和flush并不真正相关(唯一的联系是flush将在commit之前完成)。无论如何...

如果您想要控制flush()呼叫的执行方式,您可以使用EntityManager#setFlushMode()更改默认的冲洗模式。冲洗模式如下:

  • COMMIT - 刷新仅在事务提交时发生,或者在调用flush()时发生。
  • AUTO - (默认)在任何查询执行之前发生刷新。

所以这样的事情应该工作:

@Stateless 
public class SomeBean { 
    ... 
    public void doSomeStuffAndThenFlushToTheDb(){ 
     em.setFlushMode(COMMIT); 
     em.persist(entity); 
     em.persist(somethingElse); 
     em.flush(); // Causes flush 
    } 
    ... 
} 

但正如我所说,我是你的榜样感到惊讶。你描述的行为不是我所期望的。

+0

em.setFlushMode(FlushModeType.COMMIT); em.persist(match); \t \t em.clear(); \t \t em.flush(); ,我希望这个简洁的例子中没有任何东西可以保存在数据库中,但是反过来就是事实,为什么?当我通过'em.clear()'清除所有内容? – coubeatczech 2010-09-15 16:38:12

+0

@coubeatczech这是一个完全不同的问题,不容易在评论框中讨论。请打开另一个问题并提及您的JPA提供者(但您的用例实际上很奇怪)。 – 2010-09-15 17:00:00

0

首先“刷新”意味着只存储二级缓存(db驱动程序)。它不直接存储在数据库中。由于事务完成并且发送提交,因此该实体保存在缓存中。 “清除”意味着分离实体。这并不意味着清除数据库。所以事后你不能坚持这个实体了。但是在交易结束时仍然会坚持下去。

+0

其实flush()的文档说:“将持久化上下文同步到底层数据库”。但是,刷新不会导致提交 – 2013-09-20 20:56:36