Samstag, 10. März 2012

binäre Assoziation JPA


1-zu-1-Beziehung mit JPA

Hierfür dient die JPA-Annotation @OneToOne.
Im Standard wird dies über einen ForeignKey datenbankseitig abgebildet.

Unidirektional

Bei einer unidirektionalen @OneToOne-Beziehung enthält die Entität von der aus auf die andere Entität navigiert werden kann, die @OneToOne-Annotation.

mappedBy

Soll die 1-zu-1-Beziehung zwischen zweier Entitäten bidirektional sein,
dann muss in beiden Entity die @OneToOne-Annotation gesetzt sein und über das mappedBy-Attribut
wird gesagt, welche Seite die Beziehung verwaltet. Die Beziehung mit der Entität mit dem mappedBy wird von der anderen Entität verwaltet und es wird dabei auf die referenzierte Property verwiesen.
Letztendlich wird gesagt, auf welcher Seite das foreignkey-Spalte vorliegen soll.
Die Entität ohne dem mappedBy-Attribut bekommt dabei in der entsprechenden Tabelle eine ForeignKey-Spalte, um die Beziehung darstellen zu können - der Name leitet sich ab:
Tabellenname der referenzierten Tabelle + _ + Spaltenname des PKs

@Entity
public class A {
 @OneToOne
 B b;
 ...
}

@Entity
public class B {

@OneToOne(mappedBy="b")
A a;

Persistieren @OneToOne per JPA

Beim Persistieren einer @OneToOne-Beziehung muss man die Beziehung programmatisch setzen und
beide mittels persist() abspeichern.

cascade=CascadeType.PERSIST

Um zu vermeiden, dass beide Entitäten einer @OneToOne-Beziehung einzeln gespeichert werden müssen, kann man sich das cascade-Attribut bei der @OneToOne-Beziehung zu Nutze machen:
@OneToOne(cascade=CascadeType.PERSIST).
Dadurch werden die Beziehung einer Entität mitgespeichert.
Bei einer OneToOne-Beziehung "besitzt" die Entität ohne das mappedBy-Attribut, die Assoziation
und verfügt daher über die ForeignKey-Spalte und die wird gleichermaßen gespeichert, also auch die damti verknüfte Entität. Somit müssen nicht mehr auf beide Entitäten ein persist() aufgerufen werden,
ein persist() auf Entität A genügt, B wird ebenfalls gespeichert.

optional

Bei der Angabe von einer @OneToOne - Beziehung kann über den Parameter optional festgelegt werden, ob die Beziehung gesetzt sein muss oder vorliegen kann:
@OneToOne(optional=true)

Keine Kommentare:

Kommentar veröffentlichen