Jeg ville bruge koden til manuelt at håndhæve denne regel. Hovedideen er, at samlingen B skal være godt indkapslet, således at klienten kun kan ændre dens indhold ved hjælp af en offentlig metode (dvs. addB()
). Du skal blot sikre denne regel i denne metode (addB()
) for at sikre, at antallet af poster i samling B ikke kan være større end en værdi.
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;
}
Hovedpunkter:
- A bør være ejeren af forholdet.
- I A skal du ikke blot returnere B, da klienten kan omgå kontrollogikken implementeret i
addB(B b)
og ændre dets indhold frit. Returner i stedet en uforanderlig visning af B . - I @OneToMany skal du indstille
orphanRemoval
til sandt at bede JPA om at fjerne B's DB-poster efter dets tilsvarende forekomster er fjernet fra B-samlingen.