Ich würde den Code verwenden, um diese Regel manuell durchzusetzen. Die Hauptidee ist, dass die Sammlung B gut gekapselt sein sollte, sodass der Client ihren Inhalt nur durch eine öffentliche Methode ändern kann (z. B. addB()
). ) . Stellen Sie einfach diese Regel innerhalb dieser Methode sicher (addB()
), um sicherzustellen, dass die Anzahl der Einträge in der Sammlung B nicht größer als ein Wert sein kann.
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;
}
Hauptpunkte:
- A sollte der Besitzer der Beziehung sein.
- Geben Sie in A nicht einfach B zurück, da der Client die in
addB(B b)
implementierte Prüflogik umgehen kann und ändern Sie seinen Inhalt frei. Geben Sie stattdessen eine unveränderbare Ansicht von B zurück. - Legen Sie in @OneToMany
orphanRemoval
fest auf true , um JPA anzuweisen, die DB-Datensätze von B zu entfernen, nachdem die entsprechenden Instanzen aus der B-Sammlung entfernt wurden.