Tôi sẽ sử dụng mã để thực thi quy tắc này theo cách thủ công. Ý tưởng chính là tập hợp B nên được đóng gói tốt để chỉ máy khách có thể thay đổi nội dung của nó bằng một phương thức công khai (tức là addB()
). Chỉ cần đảm bảo quy tắc này bên trong phương thức này (addB()
) để đảm bảo rằng số lượng mục nhập bên trong bộ sưu tập B không được lớn hơn một giá trị.
A:
@Entity
public class A {
public static int MAX_NUM_B = 4;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private Set<B> b= new LinkedHashSet<B>();
public void addB(B b) {
if (this.b.size() == MAX_NUM_B) {
Iterator<B> it = this.b.iterator();
it.next();
it.remove();
}
this.b.add(b);
}
public Set<B> getB() {
return Collections.unmodifiableSet(this.b);
}
}
B:
@Entity
public class B{
@ManyToOne
private A a;
}
Những điểm chính:
- A phải là chủ sở hữu của mối quan hệ.
- Trong A, không chỉ trả về B vì máy khách có thể bỏ qua logic kiểm tra được triển khai trong
addB(B b)
và thay đổi nội dung của nó một cách tự do. Thay vào đó, trả lại một cái nhìn không thể thay đổi về B. - Trong @OneToMany, hãy đặt
orphanRemoval
thành true để yêu cầu JPA xóa các bản ghi DB của B sau khi các cá thể tương ứng của nó bị xóa khỏi bộ sưu tập B.