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 Stores, 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?
InformationsquelleAutor Jim Kiley | 2009-06-03
Schreibe einen Kommentar