Warum wird JPA nicht im Besitz Einheiten löschen, wenn der Eigentümer Einheit ihnen die Referenz verliert?

StackOverflow https://stackoverflow.com/questions/1133179

  •  16-09-2019
  •  | 
  •  

Frage

Ich habe eine JPA-Entität „Request“ bekam, die eine Liste der Antworten (auch JPA-Entitäten) besitzt. Hier ist, wie es definiert in Request.java:

@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;

Und in Answer.java:

@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;

Im Zuge der Programmausführung, die Liste des Antrags von Antworten haben Antworten hinzugefügt oder daraus entfernt, oder das tatsächliche Liste Objekt ersetzt werden kann. Mein Problem ist also: wenn ich eine Anfrage an die Datenbank zusammenführen, die Antwort-Objekte, die verwendet in der Liste zu sein, werden in der Datenbank gespeichert - das heißt, Antwort-Objekte, die die Anfrage nicht mehr hält eine Bezugnahme auf (indirekt über eine List) werden nicht gelöscht.

Dies ist nicht das Verhalten, das ich wünsche, als ob ich eine Anfrage an die Datenbank zusammenführen und sie dann wieder holen, seine Antworten Liste möglicherweise nicht das gleiche sein. Was mache ich einige Programmierfehler? Gibt es eine Anmerkung oder Einstellung, dass die Antworten in der Datenbank sicherzustellen, sind genau die Antworten in der Anfrageliste?

Eine Lösung ist Verweise auf die ursprünglichen Antworten Liste zu halten und dann die EntityManager verwenden, um jede alte Antwort zu entfernen, bevor der Antrag Verschmelzung, aber es scheint, wie es sollte ein sauberer Weg.

War es hilfreich?

Lösung

In JPA 1.0, was Sie wollen, können Sie sich nicht von JPA erfolgen. Einfach gesagt, müssen alle Relationship Management durch die Anwendung durchgeführt werden, einschließlich aller Waisen aus Sammlungen zu entfernen (das ist, was Sie zu tun versuchen).

In JPA 2.0, sie unterstützen (obwohl ich weiß nicht, die Details), aber je nach Implementierung ein Upgrade kann nicht einfach oder möglich sein.

Sie können auch direkt etwas wie Hibernate, aber immer noch viele JPA 1.0 Anmerkungen verwenden, etc. Ich Details auf, die entweder nicht zur Verfügung stellen kann.

In meinem Fall hat ich generischen Code geschrieben von Sammlungen zu handhaben Verschmelzung automatisch über Reflexion.

Andere Tipps

Mit Eclipse und @PrivateOwned Anmerkung zu answerList setzen würde helfen.

Es ist illegal, zusätzliche Eigenschaften in kartiert Beziehung angeben. Sie können stattdessen @DependentElement Anmerkung anfordern verwenden.

Wenn Sie Hibernate als JPA-Provider verwenden, Sie könnten ein hinzufügen

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

auf dem answerList. Dies würde Sie es bereits verwenden, zusätzlich zu den JPA Annotationen arbeiten. JPA 2 (die meisten / alle PPV-Anbieter nicht über eine Produktion bereit Implementierung zu diesem Zeitpunkt haben) können dies auf seine eigene.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top