Spring und / oder Hibernate: Speichern von Viele-zu-Viele-Beziehungen von einer Seite nach dem Senden des Formulars

8

Der Kontext

Ich habe eine einfache Assoziation zwischen zwei Entitäten - Category und Email (NtoM). Ich versuche, Web-Interface zum Durchsuchen und Verwalten von ihnen zu erstellen. Ich habe ein einfaches E-Mail-Abonnement-Bearbeitungsformular mit einer Liste von Kontrollkästchen, die Kategorien darstellen, zu denen die angegebene E-Mail gehört (ich habe den Eigenschaftseditor für Set<Category> type registriert).

Das Problem

Die Formularanzeige funktioniert gut, einschließlich der Markierung momentan zugewiesener Kategorien (für vorhandene E-Mails). Aber keine Änderungen werden in der EmailsCategories-Tabelle gespeichert (NtoM-Mapping-Tabelle, die mit @JoinTable definiert ist - es werden weder neu überprüfte Kategorien hinzugefügt noch ungeprüfte Kategorien entfernt.)

Der Code

E-Mail-Entität:

%Vor%

Kategorieentität:

%Vor%

Controller:

%Vor%

Formularansicht:

%Vor%

Bearbeiten - DAO-Code hinzugefügt

( emailService.save() ist nur ein Proxy-Aufruf an emailDao.save() )

%Vor%

Edit 2 - wenig mehr debug / logs

Ein einfaches Test-Snippet:

%Vor%

}

Und das sind Protokolle:

%Vor%

Auch bei diesen Protokollen scheint es etwas strapazierfähig zu sein - es zeigt an, dass es die Sammlung mit einem Element einfügt, aber dann sagt es, es sei leer ...

    
Rafał Wrzeszcz 09.10.2013, 18:44
quelle

1 Antwort

22

Hier gehen wir wieder.

Eine bidirektionale Assoziation hat zwei Seiten: eine Eigentümerseite und eine umgekehrte Seite. Die Eigentümerseite ist das ohne Attribut mappedBy. Um zu wissen, welche Verknüpfung zwischen Entitäten besteht, kümmert sich JPA / Hibernate nur um die Eigentümerseite. Ihr Code ändert nur die inverse Seite und nicht die Eigentümerseite.

Es ist IHRE Aufgabe, die Kohärenz des Objektgraphen zu wahren. Es ist manchmal akzeptabel, ein inkohärentes Objektdiagramm zu haben, aber das Ändern der Eigentümerseite wird die Änderungen nicht dauerhaft machen.

Sie müssen also

hinzufügen %Vor%

oder E-Mail als Eigentümerseite anstelle von Kategorie auswählen.

    
JB Nizet 10.10.2013, 09:08
quelle