このコードを使用して、このルールを手動で適用します。主なアイデアは、クライアントがパブリックメソッド(addB()
)によってのみコンテンツを変更できるように、コレクションBを適切にカプセル化する必要があるということです。 )。このメソッド内でこのルールを確認するだけです(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);
}
}
B:
@Entity
public class B{
@ManyToOne
private A a;
}
主なポイント:
- Aは関係の所有者である必要があります。
- Aでは、クライアントが
addB(B b)
に実装されているチェックロジックをバイパスできるため、単にBを返さないでください。 内容を自由に変更できます。代わりに、変更できないBのビューを返します。 - @OneToManyで、
orphanRemoval
を設定します trueにすると、対応するインスタンスがBコレクションから削除された後にBのDBレコードを削除するようにJPAに指示します。