Użyłbym kodu, aby ręcznie wymusić tę regułę. Główną ideą jest to, że kolekcja B powinna być dobrze zahermetyzowana, tak aby klient mógł zmienić jej zawartość tylko za pomocą metody publicznej (np. addB()
) . Po prostu upewnij się, że ta reguła jest w tej metodzie (addB()
), aby upewnić się, że liczba wpisów w zbiorze B nie może być większa niż wartość.
O:
@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;
}
Główne punkty:
- A powinien być właścicielem związku.
- W A , nie zwracaj po prostu B, ponieważ klient może ominąć logikę sprawdzania zaimplementowaną w
addB(B b)
i swobodnie zmieniaj jego zawartość. Zamiast tego zwróć niemodyfikowalny widok B . - W @OneToMany ustaw
orphanRemoval
na true, aby poinformować JPA, aby usunęła rekordy bazy danych B po usunięciu odpowiednich wystąpień z kolekcji B.