2017-06-02 32 views
0

我正在使用Hibenate Envers。實體審覈成功。現在我想擁有版本號(就像REV)來獲取實體,以便在每次更新時自動更新(就像@Version) 我該怎麼做? 我應該使用@Version@Audited嗎? 或者我可以得到rev_id每個實體獲得最新版本?如何在休眠審計中獲取版本號

請幫忙嗎?

回答

0

答案真的歸結爲您的用例以及您打算如何獲取價值。

如果您想要向ORM實體表發出Criteria,JPQL或HQL查詢,並且希望能夠獲取指示該行被修改頻率的數值,則應該使用@Version註解。這是ORM爲樂觀鎖定而維護其自身的一個值,但它可以用於指示行以某種方式被修改的次數。當然,缺點是當行被刪除時,你忽略了這個值。

默認情況下,Envers不會跟蹤審計模式中的@Version帶註釋的屬性。因此,如果Envers在刪除數據時存儲數據,請注意,除非您特別啓用樂觀鎖定屬性的跟蹤,否則當ORM行被刪除時,您將再次丟失該值。爲此,您要將org.hibernate.envers.do_not_audit_optimistic_locking_field設置爲false。最後,如果您想使用Envers Query API並獲取您實體的歷史表示的快照,那麼您可以通過幾種方式使用查詢API來根據Envers修訂版本號語義來確定這一點。

第一種方法是向查詢API請求與實體類關聯的所有修訂的列表,然後在相關版本中獲取每個實體快照。不幸的是,這個過程需要你在數據庫查詢上多做一些工作,所以對於頻繁修改的實體,這可能會有一些性能問題。

第二種方法是在Envers Query API上利用forRevisionsOfEntity方法,並將第二個參數指定爲false。這第二個參數有效地控制返回類型的方法將提供,其中該對象數組包含3個元素假將返回的Object[]數組:

  1. 索引0 - 實體的審計快照。
  2. 索引1 - 修訂實體(存儲時間戳和修訂號)。
  3. 索引2 - 修訂類型ADD/MOD/DEL。

這種方法優於先前的Envers方式的好處是它的單個查詢將數據組合在一起,從而更容易進行循環和處理。

所以最終它取決於你試圖服務的目的。如果它只是一個你想在任何時候使用ORM有效訪問的計數器,請使用@Version。如果您希望它與審覈快照關聯,請啓用上述屬性作爲基準。然後Envers Query API以各種方式獲取數據。