2010-09-15 43 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