Mysql
 sql >> Database >  >> RDS >> Mysql

Limita le dimensioni di una raccolta in JPA

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.