Jag skulle använda koden för att manuellt upprätthålla denna regel. Huvudtanken är att samlingen B ska vara väl inkapslad så att klienten endast kan ändra dess innehåll med en offentlig metod (dvs addB()
) . Se bara till den här regeln i den här metoden (addB()
) för att säkerställa att antalet poster i samling B inte kan vara större än ett värde.
S:
@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;
}
Huvudpunkter:
- A bör vara ägaren av relationen.
- I A , returnera inte bara B eftersom klienten kan kringgå kontrolllogiken implementerad i
addB(B b)
och ändra dess innehåll fritt. Ge istället tillbaka en oförändrbar vy av B . - I @OneToMany ställer du in
orphanRemoval
till sant att säga åt JPA att ta bort B:s DB-poster efter att dess motsvarande instanser har tagits bort från B-samlingen.