2010-07-30 67 views
6

問題是哪裏更好(或換句話說:您更喜歡哪裏)放置Jpa實體的業務驗證邏輯。驗證Jpa實體:服務中或生命週期監聽器

兩個思路是:

  1. 在EntityListener之前保存或更新將驗證實體
  2. 在提供給JPA持續存在的方法可以訪問該服務。

兩者都有優點和缺點。 使用方法2時,測試起來更容易,因爲您可能只是模擬jpa提供程序並測試驗證邏輯。另一方面,採用第1種方法時,驗證會在同一時刻發生,比如@NotNull等驗證。

我很想知道您如何解決項目中的驗證以及哪種更好的方法。

謝謝。

回答

4

下面是我按照一般的經驗法則:

當使用Bean驗證,指定不要求其它的bean依賴 規則。在另一個bean依賴 的那一刻,請讓您的服務 圖層處理該依賴關係。

換句話說,如果您在另一個bean中引用了一個bean,請避免放入該@NotNull約束。您的服務層最適合用於此目的,因爲您可以更早地捕獲違規行爲,並且更符合邏輯(因爲其他業務驗證會假定bean可用)。

作爲一個例子,考慮下面的實體(道歉它不會編譯)

@Entity 
public class User 
{ 
    @Id 
    private int id; 
    @NotNull 
    private String fullName; 
    @NotNull 
    private String email; 
    private Set<Role> roles; //No bean validation constraints here. 
    ... 
    public boolean mapRoleToUser(Role role) 
    { //Validation is done here. Including checks for a null role. 
    } 

} 

@Entity 
public class Role 
{ 
    @Id 
    private int id; 
    @NotNull 
    private String name; 
} 

在這種情況下的服務層,是應該驗證用戶是否具有附接或不作用的一個。在預先存儲或預更新階段進行驗證有點太晚了,特別是當存在具有業務邏輯的獨特服務層時,以及領域模型中的其餘業務邏輯(可悲的是,我還沒有看到單獨使用領域模型中的所有邏輯就足夠好了)。