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();