2017-02-17 58 views
0

問題: 如何在不需要獲取ConstraintValidator異常的情況下只需要ID即可將對象Account保存爲嵌套對象?如何在Hibernate中對同一個實體使用不同的驗證規則?

問題是因爲我已經把驗證規則來上課,但是當我想SEM實體保存爲嵌套的對象,我得到的例外,一些屬性值丟失。所以當我想將對象作爲一個整體來持久保存時,當我想要使用它只有一個嵌套對象(只需要ID)時,我就會有不同的驗證規則。

public class Account { 
    private int id; 

    @NotNull 
    private String name; 

    @NotNull 
    private String lastName; 

    @NotNull 
    private String userName; 
    //getters&setters 

如果我有帳戶作爲嵌套的對象我只需要ID,以便能夠使用它作爲FK(帳戶實體已經在DB),但由於@NotNull標註的我得到異常。

試圖挽救對象店鋪或如何創建不同的驗證規則,賬戶驗證只是SOEM其他屬性,而不是所有的時候有沒有辦法忽略來自帳戶的註解?

public class Shop { 
    private int id; 

    private Account owner; // only ID is needed 

你有什麼基本的例子嗎?我不明白那些在文檔中。在發佈之前,我已經閱讀過文檔。

回答

1

你想看看Bean驗證組在這裏你可以這樣當組被驗證,否則將被忽略,他們只能激活特定的驗證分類。

您可以參考獲取細節here

以從文檔的例子:

// This is just a stub interface used for tagging validation criteria 
public interface DriverChecks { 
} 

// The model 
public class Driver { 
    @Min(value = 18, message = "You must be 18", groups = DriverChecks.class) 
    private int age; 
    // other stuffs 
} 

A組無非是標籤,可以讓你根據具體使用情況在運行時啓用/禁用驗證更多。不指定一個Bean驗證註解groups屬性,則默認爲Default組,這是Bean驗證使用,如果在驗證時未指定組標籤。

這意味着滿足以下條件:

// Age won't be validated since we didn't specify DriverChecks.class 
validator.validate(driver); 

// Age will be validated here because we specify DriverChecks.class 
validator.validate(driver, DriverChecks.class); 

此,當你觸發了您的服務方法中自己驗證的偉大工程,因爲你可以手動控制基於該方法的使用情況下這組檢查都適用。

當談到直接集成Hibernate ORM的事件偵聽器,這也可以觸發bean驗證時,組規範變得有點困難,因爲它們必須基於由hibernate引發的事件類型來指定。

javax.persistence.validation.group.pre-persist 
javax.persistence.validation.group.pre-update 
javax.persistence.validation.group.pre-remove 

對於每個可以在供給到休眠的JPA屬性指定上述性質的,可以列出一個逗號分隔的要被驗證爲每個事件類型的組的列表。這允許您在插入與更新與移除期間進行不同的檢查。

如果這還不夠,總有事實,你可以創建自己的約束驗證器實現和註釋插到Bean驗證,並指定在類或屬性一級。

我已經在從多個字段值必須被驗證爲一個有機的整體,以暗示其有效性作爲正常場逐場驗證沒有足夠的情況下經常發現這個有用。

+0

你有什麼基本的例子嗎?我不明白那些在文檔中。在發佈之前,我已經閱讀過文檔。 – AndroidTank

+0

增加了更多的清晰度爲您服務。我沒去成如何準確創建自己的定製約束驗證,但我相信,文檔清楚這一點。 – Naros

相關問題