Použil bych kód k ručnímu vynucení tohoto pravidla. Hlavní myšlenkou je, že kolekce B by měla být dobře zapouzdřená, aby klient mohl její obsah měnit pouze veřejnou metodou (tj. addB()
). Jednoduše zajistěte toto pravidlo v této metodě (addB()
), aby bylo zajištěno, že počet položek v kolekci B nemůže být větší než hodnota.
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;
}
Hlavní body:
- A by měl být vlastníkem vztahu.
- V A nevracejte jednoduše B, protože klient může obejít kontrolní logiku implementovanou v
addB(B b)
a libovolně měnit jeho obsah. Místo toho vraťte neměnný pohled na B. - V @OneToMany nastavte
orphanRemoval
na true, aby JPA sdělil, aby odstranil DB záznamy B po odstranění jejich odpovídajících instancí z kolekce B.