2010-07-30 25 views
6

Câu hỏi đặt ra là ở đâu tốt hơn (hoặc nói cách khác: bạn thích) đặt logic xác thực nghiệp vụ của thực thể Jpa.Xác thực đối tượng Jpa: Trong dịch vụ hoặc bởi người nghe vòng đời

Hai ý tưởng là:

  1. Trong EntityListener rằng trước khi lưu hoặc cập nhật sẽ xác nhận các thực thể
  2. Trong dịch vụ cung cấp quyền truy cập vào các phương pháp bền bỉ JPA.

Có ưu và khuyết điểm của cả hai. Khi sử dụng phương pháp tiếp cận số 2, việc kiểm tra dễ dàng hơn vì bạn chỉ có thể giả lập nhà cung cấp jpa và kiểm tra logic xác thực. Mặt khác với cách tiếp cận số 1, việc xác thực sẽ xảy ra cùng lúc với các xác thực như @NotNull, v.v.

Tôi rất muốn biết cách bạn giải quyết các xác nhận trong các dự án của mình và đó là cách tốt nhất để đi.

Cảm ơn.

Trả lời

4

Dưới đây là một quy tắc ngón tay cái chung mà tôi làm theo:

Khi sử dụng xác nhận đậu, xác định quy tắc mà không cần phụ thuộc trên đậu khác. Thời điểm bạn phụ thuộc vào trên một bean khác, hãy sử dụng lớp dịch vụ để xử lý sự phụ thuộc đó.

Nói cách khác, nếu bạn có tham chiếu đến hạt đậu bên trong, hãy tránh đặt ràng buộc @NotNull đó. Lớp dịch vụ của bạn được sử dụng tốt nhất cho điều đó, vì bạn đang bắt vi phạm sớm hơn nhiều, và tại một điểm hợp lý hơn (vì các xác nhận hợp lệ khác của doanh nghiệp sẽ cho rằng các bean có sẵn).

Như một ví dụ, hãy xem xét các đơn vị sau đây (xin lỗi cho nó wont biên dịch)

@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; 
} 

Lớp dịch vụ trong trường hợp này, là một trong đó cần xác minh xem người dùng có vai trò gắn hay không. Việc xác minh trong giai đoạn tiền tạm dừng hoặc trước khi cập nhật hơi muộn, đặc biệt khi có một lớp dịch vụ riêng biệt có logic nghiệp vụ và phần còn lại của logic nghiệp vụ trong mô hình miền (thật đáng buồn, tôi chưa thấy ứng dụng đủ tốt với tất cả logic trong mô hình miền một mình).

Các vấn đề liên quan