JPA @ManyToMany Schreiben Auf zu Erstellen, Aber Nicht Aktualisieren
Meine Mannschaft hat zwei Klassen, User
und Store
, im Zusammenhang mit JPA @ManyToMany
Anmerkungen. Der entsprechende code ist unten.
Beim erstellen eines neuen User
Objekt und die Einstellung seiner Geschäfte gut Leben. Aber wir sehen auch, dass einige unerwartete, wenn Sie versuchen zu aktualisieren, Benutzer Objekte durch unsere Struts 2 /Spring web-UI. (Diese Probleme nicht auftreten, wenn auf das ausführen von einfachen automatisierten Integrations-tests durch die JUnit).
Einfach ausgedrückt, wird beim speichern einer User
, seine Geschäfte Auflistung wird nicht aktualisiert-die Datenbank zeigt keine Veränderungen, und lädt die User
Objekt in Frage, die zeigt, dass es sich um einen unveränderten Satz von Filialen.
Die einzige Lösung, die wir gefunden haben, um dieses problem-und wir wissen nicht, wie diese Lösung, es macht alles, was die Entwickler in unserem team ein wenig mulmig -- ist das erstellen eines neuen Set
von Store
s, dann tun user.setStores(null)
, dann tun user.setStores(stores)
.
Sind wir mit der OpenEntityManagerInViewFilter
; wir verwenden Hibernate als unsere JPA-provider; wir verwenden Spring JpaTransactionManager. Wir haben keine @Transactional
Anmerkungen in unsere code -- und das hinzufügen von Ihnen bricht Sie den vorhandenen code durch proxy-Verhalten an anderer Stelle beschrieben.
Jede Einsicht jedermann liefern könnte, wie könnten wir lösen dieses problem in einem nicht mulmig Art und Weise ist willkommen.
Relevanten Teil von User.java:
@ManyToMany
@JoinTable(name = "company.user_store_access",
joinColumns = @JoinColumn(name = "userid"),
inverseJoinColumns = @JoinColumn(name = "storeid"))
public Set<Store> getStores() {
return stores;
}
Relevanten Teil von Store.java:
@ManyToMany(mappedBy = "stores")
public List<User> getUsers() {
return users;
}
Relevanten Teile von UserDetailAction.java:
(pass-through " - Daten, und eine Schicht oder zwei, und dann:)
entity = getEntityManager().merge(entity);
- Können Sie fügen Sie bitte den code-Zeilen, wo man hinzufügen / ändern Speichern?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie eine bi-direktionale Beziehung, und in diesem Fall gibt es eine Einheit, die andere kontrolliert, und in Ihrer mapping-controlling ist die Store Person und nicht die Benutzer, so das hinzufügen eines Benutzers zu einem Geschäft arbeiten würde (da der Store ist derjenige, der steuert), aber hinzufügen von einem Speicher zu einem Benutzer werden nicht.
versuchen Sie, die Umkehrung der situation, indem Sie die Benutzer-Objekt-wer steuert das Verhältnis, indem der @ManyToMany(mappedBy = "Benutzer") - annotation der getStores () - Methode und die änderung der getUsers() ein.
Hoffe, es half.
P. S. die Entität, die steuert, der Bezug ist immer die, die nicht über das mappedBy-Attribut.
Hab ich gerade steckte gleiche problem und fand die Lösung auf einer anderen Seite.
Hier ist was für mich gearbeitet hat
aufrufen getJpaTemplate().flush() vor dem Aufruf von merge hat für mich gearbeitet.
Nicht nur ich, auch der Grund, warum es funktionierte.
Versuchen Sie bitte, den folgenden Hinweis in Ihrem Benutzer-Objekt: