JPA und CascadeTypes

Hallo,

ich habe mal eine reine Verständnissfrage.

Ich habe hier 2 Klassen

Einmal Person.java

[...]
	@OneToMany(cascade={CascadeType.PERSIST},
						mappedBy="person")
	private Set<Contact>	contact;
[...]

und Contact.java

[...]
	@ManyToOne
	@JoinColumn(name="person_id",
				referencedColumnName="id")
	private Person	person;
[...]

Wenn ich das mit dem CascadeType richtig verstehe sollte doch, wenn ich ein persist(person) mache AUCH contact persistiert werden, was er allerdings NICHT macht, erst wenn ich extra nochmal persist(contact) ausführe wird das auch persistiert.

Hab ich da irgendwo einen Denkfehler? Oder einfach nur was vergessen?

Danke

Yoshi

sieht so aus als wäre das ‘mappedBy’ wichtig,
hast du einen bestimmten Grund, es auf die Klasse zu legen, die keinen direkten Persist-Auftrag bekommt?
wenn einfach nur irgendwo übernommen, dann versuche es mal andersrum

JPA persist one-to-many relationship by non-owning side [Solved] (Object Relational Mapping forum at JavaRanch)
vorletztes Post vor allem (*),


das 4.letzte bzw. auch 4. ist auch zu empfehlen, könnte aber gut sein das du das schon hast:
verlasse dich lieber nicht drauf, nur einen neuen Contact bei Person in die Liste einzufügen oder nur im Contact das Person-Attribut zu setzen,
immer selber beide Aufgaben erledigen,
allein schon dafür dass es konsistent ist bevor das Framework irgendeine Arbeit dazu übernimmt (wer weiß wann das erst passiert)


(*) aber das nur aus halben Interesse gesucht, direkt benutze ich das nicht und vermeide auch im verwendeten Hibernate solche Konflikte,

sowas sollte das Framework freilich alleine können,
oder wenn schon begründet anders aufgebaut, dann mehr Unterstützung für User,

falls nicht zur Laufzeit, dann wenigstens für Testen/ Fehleruntersuchunge einen Dummy-Modus anbieten:
‘Speicherzeitpunkt X, zur Speicherung gemeldete Objekte sind …,
verlinkte gemappte Objekte sind …, jeweils: in DB vorhanden: ja/ nein, aktuell Persistenz-Übernahme/ Löschen ja/ nein/ wieso,
evtl. gefunden: Rückverlinkung mit Cascade-Persistenz, Warnung an User, mögliche andere Nutzung geplant, Verweis auf grundsätzliche Strategien’

usw., sollte doch nicht so schwer sein und kann ja ab x beteiligten Klassen/ y beteiligten Objekten streiken, für einfache Fälle wäre es aber so hilfreich…

Durch Dein Mapping ist Contact in der Java-Welt der Ownder der Relation. Nur auf der Seite werden Änderungen an der Relation vom ORM getrackt. Ich würde darum vermuten, dass Du tatsächlich etwas vergessen hast, nämlich in der Java-Welt die Relation auf beiden Seiten gültig zu halten. Es reicht nicht, nur ein Person.addContact zu machen. Du musst auch ein Contact.setPerson machen.