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

相关问题