{"id":10167,"date":"2018-05-26T13:12:27","date_gmt":"2018-05-26T11:12:27","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=10167"},"modified":"2018-08-17T17:25:43","modified_gmt":"2018-08-17T15:25:43","slug":"many-to-many-mit-java-persistence-api-jpa-2-0-und-spring-boot-ohne-xml","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=10167","title":{"rendered":"Many to Many mit Java Persistence API (JPA 2.0) und Spring Boot ohne XML"},"content":{"rendered":"<p>Manchmal braucht man eine &#8222;<strong>Many to Many<\/strong>&#8220; Verbindung zweier BEs mit JPA (Java Persistence API) f\u00fcr Spring Boot (2.0.2) (JEE mit EJB 3.0 ist \u00e4hnlich, nur andere Annotationen).<\/p>\n<p>Z.b. k\u00f6nnen in einem Krankenhaus mehrere \u00c4rzte arbeiten. Die \u00c4rzte wiederum k\u00f6nnen in mehreren Krankenh\u00e4usern arbeiten, wenn sie z.B. als Beleg\u00e4rzte t\u00e4tig sind. Also &#8222;<strong>Many to Many<\/strong>&#8222;:<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/05\/Manytomany.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/05\/Manytomany.png\" alt=\"\" width=\"2732\" height=\"2048\" class=\"aligncenter size-full wp-image-10168\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/05\/Manytomany.png 2732w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/05\/Manytomany-300x225.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/05\/Manytomany-768x576.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2018\/05\/Manytomany-1024x768.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Es wird von z.B. Hibernate eine Mapping-Tabelle angelegt um diese Verbindung abzubilden. Ein <strong>discribe arzt_krankenhaus;<\/strong> w\u00fcrde folgendes ergeben:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n+----------------+------------+------+-----+---------+-------+\r\n| Field          | Type       | Null | Key | Default | Extra |\r\n+----------------+------------+------+-----+---------+-------+\r\n| arzt_id        | bigint(20) | NO   | PRI | NULL    |       |\r\n| krankenhaus_id | bigint(20) | NO   | PRI | NULL    |       |\r\n+----------------+------------+------+-----+---------+-------+\r\n<\/pre>\n<p>Hier nun eine Kopiervorlage um diese wiederkehrende Verbindung anzulegen:<!--more--><\/p>\n<p>In <strong>Arzt<\/strong>.java ist folgendes n\u00f6tig:<\/p>\n<pre class=\"lang:java decode:true \" >\r\n\r\nimport javax.persistence.*;\r\n\r\n@Entity\r\n@Table(name = \"arzt\")\r\npublic class Arzt {\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\r\n\t@Column(name = \"arzt_id\")\r\n\tprivate Long id;\r\n\r\n        @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH, CascadeType.MERGE })\r\n\t@JoinTable(name = \"arzt_krankenhaus\", joinColumns = { @JoinColumn(name = \"arzt_id\") }, inverseJoinColumns = {\r\n\t@JoinColumn(name = \"krankenhaus_id\") })\r\n\tprivate Set&lt;Krankenhaus&gt; krankenhauser = new HashSet&lt;&gt;();\r\n\/\/...\r\n\r\nprotected Arzt() {\r\n\t\t\/\/ dieser Konstruktor wird nicht f\u00fcr die Objekterzeugung verwendet, nur Bean\r\n\t}\r\n\r\n\/\/ Konstruktor mit Parametern und alle Getter und Setter ...\r\n<\/pre>\n<p>Die DB Tabelle:<\/p>\n<pre class=\"lang:default decode:true \" >+----------------------+--------------+------+-----+---------+----------------+\r\n| Field                | Type         | Null | Key | Default | Extra          |\r\n+----------------------+--------------+------+-----+---------+----------------+\r\n| arzt_id              | bigint(20)   | NO   | PRI | NULL    | auto_increment |\r\n...\r\n+----------------------+--------------+------+-----+---------+----------------+<\/pre>\n<p>In <strong>Krankenhaus<\/strong>.java ist folgendes n\u00f6tig:<\/p>\n<pre class=\"lang:java decode:true \" >\r\n\r\nimport javax.persistence.*;\r\n\r\n@Entity\r\n@Table(name = \"krankenhaus\")\r\npublic class Krankenhaus {\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\r\n\t@Column(name = \"krankenhaus_id\")\r\n\tprivate Long id;\r\n\r\n        @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH,\r\n\t\t\tCascadeType.MERGE }, mappedBy = \"krankenhauser\")\r\n\tprivate Set&lt;Arzt&gt; aerzte = new HashSet&lt;&gt;();\r\n\r\n\tprotected Krankenhaus() {\r\n\t\t\/\/ dieser Konstruktor wird nicht f\u00fcr die Objekterzeugung verwendet, nur Bean\r\n\t}\r\n\/\/ Konstruktor mit Parametern und alle Getter und Setter\r\n<\/pre>\n<p>Die Krankenhaus Tabelle:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n+---------------------------+--------------+------+-----+---------+----------------+\r\n| Field                     | Type         | Null | Key | Default | Extra          |\r\n+---------------------------+--------------+------+-----+---------+----------------+\r\n| krankenhaus_id            | bigint(20)   | NO   | PRI | NULL    | auto_increment |\r\n...\r\n+---------------------------+--------------+------+-----+---------+----------------+\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Manchmal braucht man eine &#8222;Many to Many&#8220; Verbindung zweier BEs mit JPA (Java Persistence API) f\u00fcr Spring Boot (2.0.2) (JEE mit EJB 3.0 ist \u00e4hnlich, nur andere Annotationen). Z.b. k\u00f6nnen in einem Krankenhaus mehrere \u00c4rzte arbeiten. Die \u00c4rzte wiederum k\u00f6nnen in mehreren Krankenh\u00e4usern arbeiten, wenn sie z.B. als Beleg\u00e4rzte t\u00e4tig sind. Also &#8222;Many to Many&#8222;: &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=10167\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eMany to Many mit Java Persistence API (JPA 2.0) und Spring Boot ohne XML\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,5],"tags":[3271,2150,3270,2060,3269,3267,3268,3272,3273],"class_list":["post-10167","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java","tag-ejb-3-0","tag-hibernate","tag-jee","tag-jpa","tag-many-2-many","tag-many-to-many","tag-manytomany","tag-spring","tag-spring-boot"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/10167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10167"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/10167\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10167"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}