天天看點

Hibernate中持久化上下文的flush操作之一AUTO

Hibernate中持久化上下文的flush操作模式預設即為AUTO。在這種模式下,flush操作往往在如下場景下自動執行:

  • 遇到持久化上下文的事務送出,那麼在事務送出之前執行flush操作
  • 在即将執行的HQL查詢中涉及到了被緩沖的Entity對象
  • 在即将執行的native SQL查詢中涉及到了被緩沖的Entity對象

下面以JPA的EntityManager為例介紹flushMode="AUTO"的各個場景。

1.持久化上下文送出事務

entityManager = entityManagerFactory().createEntityManager();
txn = entityManager.getTransaction();
txn.begin();

Person person = new Person( "John Doe" );
entityManager.persist( person );

//flush executed
txn.commit();
           

2.即将執行的HQL查詢中涉及到了被緩沖的Entity對象

Person person = new Person( "John Doe" );
entityManager.persist( person );

entityManager.createQuery( "select p from Advertisement p" ).getResultList();

//flush executed
entityManager.createQuery( "select p from Person p" ).getResultList();
           

3.即将執行的native SQL查詢中涉及到了被緩沖的Entity對象

在這種情況下,JPA的EntityManager将會無條件地執行flush操作,如下所示:

Person person = new Person( "John Doe" );
entityManager.persist( person );

entityManager.createNativeQuery("select count(*) from Person").getSingleResult();
           

但是,Hibernate的Session必須在如下情況下才執行flush操作:

Person person = new Person( "John Doe" );
entityManager.persist( person );
Session session = entityManager.unwrap(Session.class);

session.createSQLQuery( "select count(*) from Person").addSynchronizedEntityClass(Person.class).uniqueResult();
           

繼續閱讀