Userei il codice per applicare manualmente questa regola. L'idea principale è che la raccolta B dovrebbe essere ben incapsulata in modo tale che solo il client possa cambiarne il contenuto con un metodo pubblico (cioè addB()
). Assicurati semplicemente questa regola all'interno di questo metodo (addB()
) per garantire che il numero di voci all'interno della raccolta B non possa essere maggiore di un valore.
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;
}
Punti principali:
- A dovrebbe essere il proprietario della relazione.
- In A , non restituire semplicemente B poiché il client può bypassare la logica di controllo implementata in
addB(B b)
e modificarne il contenuto liberamente. Restituisci invece una vista non modificabile di B . - In @OneToMany , imposta
orphanRemoval
su true per indicare a JPA di rimuovere i record DB di B dopo che le istanze corrispondenti sono state rimosse dalla raccolta B.