我会使用代码手动执行此规则。主要思想是集合 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> 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);
}
}
乙:
@Entity
public class B{
@ManyToOne
private A a;
}
要点:
- A 应该是关系的所有者。
- 在 A 中,不要简单地返回 B,因为客户端可以绕过其中实现的检查逻辑
addB(B b)
并自由更改其内容。相反,返回 B 的不可修改视图。
- 在 @OneToMany 中,设置
orphanRemoval
为 true 以告诉 JPA 在从 B 集合中删除其相应实例后删除 B 的 DB 记录。