1. 程式人生 > >JPA的FlushModeType與Hibernate的FlushMode

JPA的FlushModeType與Hibernate的FlushMode

Hibernate session FlushMode有五種屬性:
1、NEVEL:已經廢棄了,被MANUAL取代了
2 MANUAL:
如果FlushMode是MANUAL或NEVEL,在操作過程中hibernate會將事務設定為readonly,所以在Spring與Hibernate整合後進行增加、刪除或修改操作過程中會出現如下錯誤
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition;
解決辦法:配置事務,spring會讀取事務中的各種配置來覆蓋hibernate的session中的FlushMode;
3 AUTO
設定成auto之後,當程式進行查詢、提交事務或者呼叫session.flush()的時候,都會使快取和資料庫進行同步,也就是重新整理資料庫。
4 COMMIT
提交事務或者session.flush()時,重新整理資料庫;查詢不重新整理
5 ALWAYS:
每次進行查詢、提交事務、session.flush()的時候都會刷資料庫
ALWAYS和AUTO的區別:當hibernate快取中的物件被改動之後,會被標記為髒資料(即與資料庫不同步了)。當 session設定為FlushMode.AUTO時,hibernate在進行查詢的時候會判斷快取中的資料是否為髒資料,是則刷資料庫,不是則不刷, 而always是直接重新整理,不進行任何判斷。很顯然auto比always要高效得多。

JPA的FlushModeType只有兩種:

1、COMMIT:僅當提交事務時才能進行重新整理

2、AUTO:(預設)在執行查詢時進行重新整理