Eu usaria o código para aplicar manualmente essa regra. A ideia principal é que a coleção B deve ser bem encapsulada de forma que o cliente só possa alterar seu conteúdo por um método público (ou seja,
addB()
). Basta garantir esta regra dentro deste método (addB()
) para garantir que o número de entradas dentro da coleção B não seja maior que um valor. UMA:
@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;
}
Pontos principais:
- A deve ser o proprietário do relacionamento.
- Em A , não retorne simplesmente B, pois o cliente pode ignorar a lógica de verificação implementada em
addB(B b)
e altere seu conteúdo livremente. Em vez disso, retorne uma visualização não modificável de B. - Em @OneToMany , defina
orphanRemoval
to true para dizer ao JPA para remover os registros de banco de dados de B depois que suas instâncias correspondentes forem removidas da coleção B.