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
orphanRemoval
a 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.