Ik zou de code gebruiken om deze regel handmatig af te dwingen. Het belangrijkste idee is dat de collectie B goed moet worden ingekapseld, zodat de klant de inhoud alleen kan wijzigen door middel van een openbare methode (d.w.z. addB()
) . Zorg ervoor dat deze regel binnen deze methode (addB()
) om ervoor te zorgen dat het aantal items in collectie B niet groter kan zijn dan een waarde.
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;
}
Belangrijkste punten:
- A zou de eigenaar van de relatie moeten zijn.
- Retourneer in A niet gewoon B omdat de klant de controlelogica kan omzeilen die is geïmplementeerd in
addB(B b)
en de inhoud ervan vrij wijzigen. Geef in plaats daarvan een niet-aanpasbare weergave van B terug. - Stel in @OneToMany
orphanRemoval
. in to true om JPA te vertellen de DB-records van B te verwijderen nadat de bijbehorende instanties uit de B-verzameling zijn verwijderd.