我会使用代码手动强制执行此规则.主要思想是集合B应该被很好地封装,使得客户端只能通过公共方法(即addB())来改变其内容.只需在此方法(addB())中确保此规则,以确保集合B内的条目数不能大于值.
A:
@Entity
public class A {
public static int MAX_NUM_B = 4;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private Set b= new LinkedHashSet();
public void addB(B b) {
if (this.b.size() == MAX_NUM_B) {
Iterator it = this.b.iterator();
it.next();
it.remove();
}
this.b.add(b);
}
public Set getB() {
return Collections.unmodifiableSet(this.b);
}
}
B:
@Entity
public class B{
@ManyToOne
private A a;
}
要点:
> A应该是关系的所有者.
>在A中,不要简单地返回B,因为客户端可以绕过addB(B b)中实现的检查逻辑并自由地更改其内容.相反,返回B的不可修改的视图.
>在@OneToMany中,将orphanRemoval设置为true以告诉JPA在从B集合中删除相应的实例后删除B的DB记录.