Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Limitar o tamanho de uma coleção em JPA


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.