In der objektorientierten Programmierung ist üblich, dass Objekte verschachtelt werden. So ist es auch üblich, dass Entitäten von anderen Entitäten umschlossen werden. Dieser Artikel zeigt, wie geschachtelte Entitäten mit APersist konfiguriert und verwaltet werden können
Über APersist wird jede Entität in einer eigenen Datenbank-Tabelle persistiert. Das bedeute, dass Entitäten, die auf anderen Entitäten verweisen, auch durch das Framework verknüpft werden müssen. Für diese Beziehungen (1:1 bzw. 1:n) stellt APersist wiederum Annotationen bereit, die lediglich an das entsprechende Attribut angefügt werden müssen.
Als Beispiel wird eine Vater-Kind-Beziehnung verwenden, um zu zeigen, wie mehrere Entitäten konfiguriert werden müssen, um die Beziehungen durch APersist verwalten zu lassen.
1. 1:1 – Beziehung
Im genannten Beispiel gibt es eine 1:1 – Beziehung zwischen Vaten und Kind. Ein Kind hat immer nur einen (biologischen) Vater. So sind zwei Entity-Klassen denkbar, die den Vater und das Kind darstellen:
@PersistenceClass
public class Vater {
@Id( autoincrement = true )
private Long id;
public Long getId() {
return id;
}
public void setId( Long id ) {
this.id = id;
}
}
@PersistenceClass
public class Kind {
@Id (autoincrement = true)
private Long id;
private Vater vater;
public Long getId() {
return id;
}
public void setId( Long id ) {
this.id = id;
}
public Vater getVater() {
return vater;
}
public void setVater( Vater vater ) {
this.vater = vater;
}
}
Die 1:1 – Beziehung wird hierbei in der Klasse Kind relaisiert.
Um die beiden Klassen auch Datenbankseitig zu verknüpfen, gibt es die Annotation @ToOne.
Es genügt ein einfachen annotieren des entsprechenden Attributs in der Klasse Kind:
@PersistenceClass
public class Kind {
@Id (autoincrement = true)
private Long id;
@ToOne
private Vater vater;
public Long getId() {
return id;
}
public void setId( Long id ) {
this.id = id;
}
public Vater getVater() {
return vater;
}
public void setVater( Vater vater ) {
this.vater = vater;
}
}
2. 1:n – Beziehung
Für die 1:n – Beziehung ist zuerst zu erwähnen, dass in einer Klasse hierzu ein Typ verwendet wird, welcher vom Typ java.util.Collection erbt. Ein Beispiel hierfür wäre, dass ein Vater mehrere Kinder haben kann. Diese Beziehung würde man normalerweise in der Klasse Vater hinterlegen:
@PersistenceClass
public class Vater {
@Id( autoincrement = true )
private Long id;
private Collection<Kind> kinder;
public Long getId() {
return id;
}
public void setId( Long id ) {
this.id = id;
}
public Collection<Kind> getKinder() {
return kinder;
}
public void setKinder( Collection<Kind> kinder ) {
this.kinder = kinder;
}
}
Für die Konfiguration wird die Annotation @ToMany benötigt. Diese erfordert aber eine Deklaration für das Feld target. Dieses Feld repräsentiert die Ziel-Entität. Somit in für dieses Beispiel die Klasse Kind als target zu hinterlegen:
@PersistenceClass
public class Vater {
@Id( autoincrement = true )
private Long id;
@ToMany (target = Kind.class)
private Collection<Kind> kinder;
public Long getId() {
return id;
}
public void setId( Long id ) {
this.id = id;
}
public Collection<Kind> getKinder() {
return kinder;
}
public void setKinder( Collection<Kind> kinder ) {
this.kinder = kinder;
}
}
Darüberhinaus stellt APersist auch noch andere Annotation bereit, die für spezielle Ausprägungen der o.g. Beziehungen verwendet werden (@ToOneOrNon, @ToManyMinOne).