2014-01-23 19 views
0

我試圖使用休眠@Size驗證在一對多集合這是懶惰的初始化。如果我正在創建具有在此集合中添加的子項的父實體,則驗證將應用於嘗試持久化。 但是,如果我只是找到父實體,然後做一個getChildren(),驗證根本不應用。我甚至試圖把註釋放在getter上。所以我使用@Size(max = 1),但即使孩子超過1,hibernate仍然不會拋出任何異常。即使EAGER獲取也無濟於事。 截至目前爲止,我不得不把驗證邏輯放在getter中,但顯然這不是乾淨的方法。請讓我知道是否有人遇到過這個問題,如果有任何優雅的方式做到這一點。Hibernate驗證對於代理收集

回答

1

基於事件的驗證在持續,更新和刪除時觸發。這些是JPA爲發生Bean驗證而定義的事件(有關更多詳細信息,請參閱JSR-317和JSR-338規範)。從數據庫加載實體/關聯時沒有驗證。假設是持久數據已經過驗證。如果您需要在您的方案中進行驗證,則確實需要手動進行驗證。

+0

只是要知道,是否有任何優雅的方式在懶惰的getter調用中進行驗證?像攔截器或其他配置?或者在getter本身中添加java邏輯是唯一的出路? –

+0

我想攔截器會工作。如何看起來取決於你想使用的技術。您也可以嘗試註冊PostCollectionUpdateEventListener。你應該得到一個可以嘗試驗證的加載集合。儘管如此,我仍然對此持懷疑態度,而不會進一步理解你的用例。 – Hardy

+0

這種情況很簡單,我希望強制孩子收集的最大尺寸限制。就像我做一個getChildren(),應該有一個驗證完成,沒有孩子被返回<=最大。現在我可以通過getter中的java邏輯來做到這一點,但我在印象@Size中會做得更優雅,但它不會像加載中提到的那樣觸發加載。 –

1

Hibernate Validator provides two TraversableResolvers out of the box which will be enabled automatically depending on your environment. The first is DefaultTraversableResolver which will always return true for isReachable() and isTraversable(). The second is JPATraversableResolver which gets enabled when Hibernate Validator is used in combination with JPA 2.

創建自己的實現的TraversableResolver或使用DefaultTraversableResolver和配置Hibernate驗證。

public class MyTraversableResolver implements TraversableResolver { 

    @Override 
    public boolean isReachable(
      Object traversableObject, 
      Node traversableProperty, 
      Class<?> rootBeanType, 
      Path pathToTraversableObject, 
      ElementType elementType) { 
     return true; 
    } 

    @Override 
    public boolean isCascadable(
      Object traversableObject, 
      Node traversableProperty, 
      Class<?> rootBeanType, 
      Path pathToTraversableObject, 
      ElementType elementType) { 
     return true; 
    } 
} 
+0

當你說配置Hibernate驗證器,配置它爲什麼?初始化延遲加載的集合或通過if-else有點邏輯強制實施自定義驗證? –