J'utiliserais le code pour appliquer manuellement cette règle. L'idée principale est que la collection B doit être bien encapsulée de sorte que seul le client puisse modifier son contenu par une méthode publique (c'est-à-dire addB()
). Assurez-vous simplement de cette règle à l'intérieur de cette méthode (addB()
) pour s'assurer que le nombre d'entrées à l'intérieur de la collection B ne peut pas être supérieur à une valeur.
R :
@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;
}
Points principaux :
- A doit être le propriétaire de la relation.
- Dans A , ne retournez pas simplement B car le client peut contourner la logique de vérification implémentée dans
addB(B b)
et modifier librement son contenu. Renvoie plutôt une vue non modifiable de B . - Dans @OneToMany , définissez
orphanRemoval
à true pour indiquer à JPA de supprimer les enregistrements de la base de données de B après la suppression de ses instances correspondantes de la collection B.