在刷新之前管理持久性上下文

时间:2010-09-15 17:13:48

标签: hibernate orm jpa java-ee ejb-3.0

将hibernate-link和JTA视为执行提供程序。我如何强迫他们不要冲洗任何东西,并自己处理它?<​​/ p>

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

我希望没有什么东西冲进数据库,但我可以在mysql shell中看到。那么如何强制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>

1 个答案:

答案 0 :(得分:0)

  

我如何强迫他们不要冲洗任何东西,并自己处理?

正如your previous question中所述,如果您想在提交JTA事务之前避免任何自动em.setFlushMode(FlushType.COMMIT) ,请使用flush(在{{3}}结束时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() <再次强大> 实体。

我明天会对此进行更广泛的测试(即使我认为这个用例没有多大意义)并且会更新我的答案。