Mein Team hat zwei Klassen, User
und Store
, verwandt von JPA @ManyToMany
Annotationen. Der entsprechende Code ist unten.JPA @ManyToMany Schreiben auf erstellen, aber nicht aktualisieren
Bei der Erstellung eines neuen User
Objekts und der Einstellung seiner Filialen ist das Leben gut. Aber wir sehen ein unerwartetes Verhalten beim Versuch, Benutzerobjekte über unsere Struts 2/Spring-Webbenutzeroberfläche zu aktualisieren. (Diese Probleme treten nicht auf, wenn einfache automatische Integrationstests über JUnit ausgeführt werden).
Einfach gesagt, beim Speichern einer User
, seine Stores Sammlung wird nicht aktualisiert - die Datenbank zeigt keine Änderungen, und das Neuladen des User
Objekts in Frage zeigt, dass es einen unveränderten Satz von Speichern hat.
Die einzige Lösung, die wir für dieses Problem gefunden haben - und wir mögen diese Lösung nicht, es macht alle Entwickler in unserem Team ein bisschen mulmig - ist es, einen neuen Set
von Store
s dann zu erstellen tun Sie user.setStores(null)
, dann tun Sie user.setStores(stores)
.
Wir verwenden die OpenEntityManagerInViewFilter
; Wir verwenden Hibernate als JPA-Anbieter. Wir verwenden Spring's JpaTransactionManager. Wir haben keine @Transactional
Annotationen in unserem Code - und das Hinzufügen von ihnen bricht den vorhandenen Code aufgrund des anderswo beschriebenen Proxy-Verhaltens.
Jeder Einblick, den jemand geben könnte, wie wir dieses Problem in einer nicht-mulmigen Weise lösen könnten, ist willkommen.
relevante Teile User.java:
@ManyToMany
@JoinTable(name = "company.user_store_access",
joinColumns = @JoinColumn(name = "userid"),
inverseJoinColumns = @JoinColumn(name = "storeid"))
public Set<Store> getStores() {
return stores;
}
relevante Teile Store.java:
@ManyToMany(mappedBy = "stores")
public List<User> getUsers() {
return users;
}
Relevante Teile UserDetailAction.java: (Durchreiche eine Schicht nach unten oder zwei, und dann :)
entity = getEntityManager().merge(entity);
Können Sie bitte die Codezeilen hinzufügen, in denen Sie Shops hinzufügen/ändern? –