{"id":3,"date":"2018-06-08T08:12:50","date_gmt":"2018-06-08T06:12:50","guid":{"rendered":"http:\/\/gundermann2.bplaced.net\/htdocs\/wordpress\/?p=3"},"modified":"2018-06-08T08:12:50","modified_gmt":"2018-06-08T06:12:50","slug":"konfiguration-einer-entitaet-als-attribut-einer-anderen-entitaet","status":"publish","type":"post","link":"https:\/\/blog.nigdev.de\/?p=3","title":{"rendered":"Konfiguration einer Entit\u00e4t als Attribut einer anderen Entit\u00e4t"},"content":{"rendered":"<p>In der objektorientierten Programmierung ist \u00fcblich, dass Objekte verschachtelt werden. So ist es auch \u00fcblich, dass Entit\u00e4ten von anderen Entit\u00e4ten umschlossen werden. Dieser Artikel zeigt, wie geschachtelte Entit\u00e4ten mit APersist konfiguriert und verwaltet werden k\u00f6nnen<!--more--><\/p>\n<p>\u00dcber APersist wird jede Entit\u00e4t in einer eigenen Datenbank-Tabelle persistiert. Das bedeute, dass Entit\u00e4ten, die auf anderen Entit\u00e4ten verweisen, auch durch das Framework verkn\u00fcpft werden m\u00fcssen. F\u00fcr diese Beziehungen (<em>1:1<\/em> bzw. <em>1:n<\/em>) stellt APersist wiederum Annotationen bereit, die lediglich an das entsprechende Attribut angef\u00fcgt werden m\u00fcssen.<\/p>\n<p>Als Beispiel wird eine <em>Vater-Kind-Beziehnung <\/em>verwenden, um zu zeigen, wie mehrere Entit\u00e4ten konfiguriert werden m\u00fcssen, um die Beziehungen durch APersist verwalten zu lassen.<\/p>\n<h1>1.<em> 1:1 &#8211; Beziehung<\/em><\/h1>\n<p>Im genannten Beispiel gibt es eine <em>1:1 &#8211; Beziehung<\/em> 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:<\/p>\n<pre><code lang=\"java\">@PersistenceClass\r\npublic class Vater {\r\n\r\n  @Id( autoincrement = true )\r\n  private Long id;\r\n\r\n  public Long getId() {\r\n    return id;\r\n  }\r\n\r\n  public void setId( Long id ) {\r\n    this.id = id;\r\n  }\r\n\r\n}\r\n\r\n@PersistenceClass\r\npublic class Kind {\r\n\r\n  @Id (autoincrement = true)\r\n  private Long id;\r\n  \r\n  private Vater vater;\r\n\r\n  public Long getId() {\r\n    return id;\r\n  }\r\n\r\n  public void setId( Long id ) {\r\n    this.id = id;\r\n  }\r\n\r\n  public Vater getVater() {\r\n    return vater;\r\n  }\r\n\r\n  public void setVater( Vater vater ) {\r\n    this.vater = vater;\r\n  }\r\n  \r\n}\r\n\r\n<\/code><\/pre>\n<p>Die <em>1:1 &#8211; Beziehung<\/em> wird hierbei in der Klasse <em>Kind<\/em> relaisiert.<\/p>\n<p>Um die beiden Klassen auch Datenbankseitig zu verkn\u00fcpfen, gibt es die Annotation <em>@ToOne.<\/em><\/p>\n<p>Es gen\u00fcgt ein einfachen annotieren des entsprechenden Attributs in der Klasse <em>Kind<\/em>:<\/p>\n<pre><code lang=\"java\">@PersistenceClass\r\npublic class Kind {\r\n\r\n  @Id (autoincrement = true)\r\n  private Long id;\r\n  \r\n  @ToOne\r\n  private Vater vater;\r\n\r\n  public Long getId() {\r\n    return id;\r\n  }\r\n\r\n  public void setId( Long id ) {\r\n    this.id = id;\r\n  }\r\n\r\n  public Vater getVater() {\r\n    return vater;\r\n  }\r\n\r\n  public void setVater( Vater vater ) {\r\n    this.vater = vater;\r\n  }\r\n  \r\n}<\/code><\/pre>\n<h1>2. <em>1:n &#8211; Beziehung<\/em><\/h1>\n<p>F\u00fcr die <em>1:n &#8211; Beziehung<\/em> ist zuerst zu erw\u00e4hnen, dass in einer Klasse hierzu ein Typ verwendet wird, welcher vom Typ <em>java.util.Collection<\/em> erbt. Ein Beispiel hierf\u00fcr w\u00e4re, dass ein Vater mehrere Kinder haben kann. Diese Beziehung w\u00fcrde man normalerweise in der Klasse <em>Vater<\/em> hinterlegen:<\/p>\n<pre><code lang=\"java\">@PersistenceClass\r\npublic class Vater {\r\n\r\n  @Id( autoincrement = true )\r\n  private Long id;\r\n\r\n  private Collection&lt;Kind&gt; kinder;\r\n  \r\n  public Long getId() {\r\n    return id;\r\n  }\r\n\r\n  public void setId( Long id ) {\r\n    this.id = id;\r\n  }\r\n\r\n  public Collection&lt;Kind&gt; getKinder() {\r\n    return kinder;\r\n  }\r\n\r\n  public void setKinder( Collection&lt;Kind&gt; kinder ) {\r\n    this.kinder = kinder;\r\n  }\r\n\r\n}<\/code><\/pre>\n<p>F\u00fcr die Konfiguration wird die Annotation <em>@ToMany<\/em> ben\u00f6tigt. Diese erfordert aber eine Deklaration f\u00fcr das Feld <em>target<\/em>. Dieses Feld repr\u00e4sentiert die Ziel-Entit\u00e4t. Somit in f\u00fcr dieses Beispiel die Klasse <em>Kind<\/em> als <em>target <\/em>zu hinterlegen:<\/p>\n<pre><code lang=\"java\">@PersistenceClass\r\npublic class Vater {\r\n\r\n  @Id( autoincrement = true )\r\n  private Long id;\r\n\r\n  @ToMany (target = Kind.class)\r\n  private Collection&lt;Kind&gt; kinder;\r\n  \r\n  public Long getId() {\r\n    return id;\r\n  }\r\n\r\n  public void setId( Long id ) {\r\n    this.id = id;\r\n  }\r\n\r\n  public Collection&lt;Kind&gt; getKinder() {\r\n    return kinder;\r\n  }\r\n\r\n  public void setKinder( Collection&lt;Kind&gt; kinder ) {\r\n    this.kinder = kinder;\r\n  }\r\n\r\n}<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>Dar\u00fcberhinaus stellt APersist auch noch andere Annotation bereit, die f\u00fcr spezielle Auspr\u00e4gungen der o.g. Beziehungen verwendet werden (<em>@ToOneOrNon, @ToManyMinOne<\/em>).<\/p>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=NielsGundermann\" class=\"twitter-share-button\">Twittern<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In der objektorientierten Programmierung ist \u00fcblich, dass Objekte verschachtelt werden. So ist es auch \u00fcblich, dass Entit\u00e4ten von anderen Entit\u00e4ten umschlossen werden. Dieser Artikel zeigt, wie geschachtelte Entit\u00e4ten mit APersist konfiguriert und verwaltet werden k\u00f6nnen<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=\/wp\/v2\/posts\/3"}],"collection":[{"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3"}],"version-history":[{"count":2,"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=\/wp\/v2\/posts\/3\/revisions"}],"predecessor-version":[{"id":97,"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=\/wp\/v2\/posts\/3\/revisions\/97"}],"wp:attachment":[{"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.nigdev.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}