このコードを使用して、このルールを手動で適用します。主なアイデアは、クライアントがパブリックメソッド(つまり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では、クライアントがに実装されているチェックロジックをバイパスしてその内容を自由に変更できるため、単にBを返さないでください
addB(B b)
。代わりに、Bの変更不可能なビューを返します。
- @OneToManyで、
orphanRemoval
trueに設定すると、対応するインスタンスがBコレクションから削除された後にBのDBレコードを削除するようにJPAに指示します。