2010-09-15 24 views
1

將hibernate-link和JTA視爲持久性提供者。我如何強迫他們不要衝洗任何東西,並自己處理它?在刷新之前管理持久化上下文

@Stateless 
public class SomeBean{ 
    @PersistenceContext 
    EntityManager em; 
    public void method(){ 
    em.persist(entity); // will get managed 
    em.clear(); // everything gets unmanaged 
    } 
} 

我希望沒有什麼刷新到數據庫中,但我可以在mysql外殼見。那麼我如何強制EntityManager在持續後不刷新任何東西? 謝謝
persistence.xml的完整性

 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd "> 
    <persistence-unit name="pu" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence 
    <jta-data-source>jdbc/fotbalDataSource 
    <properties> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

回答

0

我怎麼能強迫EM不刷新什麼,由我自己來處理呢?

your previous question回答,請em.setFlushMode(FlushType.COMMIT)如果你想避免任何自動flush前提交JTA事務(在EJB方法的結束)。請記住,在提交時會有flush

我希望沒有東西刷新到數據庫中,但是我可以在mysql shell中看到。

我不認爲你正在顯示的代碼片段說明了上述問題,這是一個不同的問題。反正...繼續之前,這裏是JPA規範說,大約clear()

/** 
* Clear the persistence context, causing all managed 
* entities to become detached. Changes made to entities that 
* have not been flushed to the database will not be 
* persisted. 
*/ 
public void clear(); 

所以clear()導致所有被管理的實體,成爲分離,不非託管

換句話說,而該規範是有點陰天關於您的使用情況下,我不認爲調用clear()應該使你的代碼傳遞給persist()實體片斷又一個實體。

明天我會對此進行更廣泛的測試(即使我認爲這個用例沒有多大意義)並且會更新我的答案。

+0

它看起來像一個休眠的bug。我切換到eclipselink後,它按預期工作 – coubeatczech 2010-09-16 10:19:37

+0

@coubeatczech有趣。我真的很想知道這是否是對規範解釋的錯誤或不同。您是否創建了Jira問題? – 2010-09-16 10:23:25

+0

@coubeatczech不知何故,我不相信你所「期待」的是正確的行爲。 JPA規範沒有定義任何NEW - > MANAGED - > NEW轉換。而且由於NEW - > MANAGED - > DETACHED需要使實體在分離之前保持持久性,所以我認爲Hibernate實際上更加正確。 – 2010-09-16 14:54:42

相關問題