Usaría el código para hacer cumplir manualmente esta regla. La idea principal es que la colección B debe estar bien encapsulada de modo que el cliente solo pueda cambiar su contenido mediante un método público (es decir, addB() ) . Simplemente asegúrese de esta regla dentro de este método (addB() ) para asegurarse de que el número de entradas dentro de la colección B no sea mayor que un valor.
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;
}
Puntos principales:
- A debe ser el dueño de la relación.
- En A, no devuelva simplemente B, ya que el cliente puede omitir la lógica de verificación implementada en
addB(B b)y cambie su contenido libremente. En su lugar, devuelva una vista no modificable de B. - En @OneToMany, configure
orphanRemovala verdadero para decirle a JPA que elimine los registros de la base de datos de B después de que sus instancias correspondientes se eliminen de la colección B.