Ich verwende derzeit Hibernate in einem Projekt und ich habe Probleme beim Einrichten einer Viele zu viele Beziehung. Ich denke, mein Problem hängt mit den Cascade-Typen zusammen.Hibernate viele zu viele Kaskadenarten Problem
Das Szenario ist, wir haben eine Anzeige und jede Anzeige kann viele Tags haben, aber jedes Tag kann mit vielen Anzeigen verwandt sein. Die ManyToMany Anmerkung der Inserates Einheit ist:
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "adMediaAdvertiserTag",
joinColumns = { @JoinColumn(name = "adMediaId") },
inverseJoinColumns = { @JoinColumn(name = "advertiserTagId") })
Und das ManyToMany-Mapping auf dem Tag Entität:
@ManyToMany(mappedBy = "advertiserTags", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
Ich sehe zwei unterschiedliche Fehler abhängig von der Konfiguration der Kaskadentypen und wenn die Das Tag existiert bereits in der Datenbank.
Wenn der Kaskadentyp auf der Anzeige nicht enthält PERSIST und der Tag nicht schon existieren, dann bekommen wir diese Ausnahme:
TransientObjectException: object references an unsaved transient instance
Und wenn der Kaskadentyp auf der Anzeige PERSIST enthält und die Tag bereits existiert, erhalten wir:
PersistentObjectException: detached entity passed to persist
die einzige Art, wie ich diese Arbeits bekommen kann, ist nicht PERSIST als Kaskadentyp, sondern eine Schleife durch jeden Tag und an die Sitzung speichern.
Ist dies der richtige Ansatz? Gibt es eine Möglichkeit, dass der Winterschlaf für mich automatisch funktioniert?
Lassen Sie mich wissen, wenn dies nicht klar ist oder Sie weitere Informationen benötigen.
UPDATE
ich die Objekte speicherte einen Dienst verwenden, die die CrudRepository Aufgabe des spring speichert Methode verwendet. Es gibt eine Menge Code, also kann ich nicht alles posten.
Ich rufe derzeit keine Merge oder Persist-Methode für irgendein Objekt auf, das ich versuche zu speichern. Ich hatte den Eindruck, dass Hibernate so etwas für mich erledigen würde.
So Sie sagen, dass einige der Tags bereits existieren könnten, da einige von ihnen neu sind und beibehalten werden müssen. Wenn ja, sollte es nicht ein Aufruf sein, zu "fusionieren" statt zu "persistieren"? –
Ja, das ist richtig. Ich habe das versucht, aber wenn ein neues Tag hinzugefügt wird, gibt es TransientObjectException zurück: Objekt verweist auf eine nicht gespeicherte vorübergehende Instanz –
Meinst du CascadeType oder die Methode, die zum Speichern des Objekts verwendet wird? –