Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Begrenzen Sie die Größe einer Sammlung in JPA

Ich würde den Code verwenden, um diese Regel manuell durchzusetzen. Die Hauptidee ist, dass die Sammlung B gut gekapselt sein sollte, sodass der Client ihren Inhalt nur durch eine öffentliche Methode ändern kann (z. B. addB()). ) . Stellen Sie einfach diese Regel innerhalb dieser Methode sicher (addB() ), um sicherzustellen, dass die Anzahl der Einträge in der Sammlung B nicht größer als ein Wert sein kann.

A:

@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;
}

Hauptpunkte:

  • A sollte der Besitzer der Beziehung sein.
  • Geben Sie in A nicht einfach B zurück, da der Client die in addB(B b) implementierte Prüflogik umgehen kann und ändern Sie seinen Inhalt frei. Geben Sie stattdessen eine unveränderbare Ansicht von B zurück.
  • Legen Sie in @OneToMany orphanRemoval fest auf true , um JPA anzuweisen, die DB-Datensätze von B zu entfernen, nachdem die entsprechenden Instanzen aus der B-Sammlung entfernt wurden.