Many to Many mit Java Persistence API (JPA 2.0) und Spring Boot ohne XML

Erstellt am 26. Mai 2018 von It_berater

Manchmal braucht man eine „Many to Many“ Verbindung zweier BEs mit JPA (Java Persistence API) für Spring Boot (2.0.2) (JEE mit EJB 3.0 ist ähnlich, nur andere Annotationen).

Z.b. können in einem Krankenhaus mehrere Ärzte arbeiten. Die Ärzte wiederum können in mehreren Krankenhäusern arbeiten, wenn sie z.B. als Belegärzte tätig sind. Also „Many to Many„:

Es wird von z.B. Hibernate eine Mapping-Tabelle angelegt um diese Verbindung abzubilden. Ein discribe arzt_krankenhaus; würde folgendes ergeben:

+----------------+------------+------+-----+---------+-------+
| Field          | Type       | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| arzt_id        | bigint(20) | NO   | PRI | NULL    |       |
| krankenhaus_id | bigint(20) | NO   | PRI | NULL    |       |
+----------------+------------+------+-----+---------+-------+

Hier nun eine Kopiervorlage um diese wiederkehrende Verbindung anzulegen:

In Arzt.java ist folgendes nötig:

import javax.persistence.*;

@Entity
@Table(name = "arzt")
public class Arzt {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "arzt_id")
	private Long id;

        @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
	@JoinTable(name = "arzt_krankenhaus", joinColumns = { @JoinColumn(name = "arzt_id") }, inverseJoinColumns = {
	@JoinColumn(name = "krankenhaus_id") })
	private Set<Krankenhaus> krankenhauser = new HashSet<>();
//...

protected Arzt() {
		// dieser Konstruktor wird nicht für die Objekterzeugung verwendet, nur Bean
	}

// Konstruktor mit Parametern und alle Getter und Setter ...

Die DB Tabelle:

+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| arzt_id              | bigint(20)   | NO   | PRI | NULL    | auto_increment |
...
+----------------------+--------------+------+-----+---------+----------------+

In Krankenhaus.java ist folgendes nötig:

import javax.persistence.*;

@Entity
@Table(name = "krankenhaus")
public class Krankenhaus {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "krankenhaus_id")
	private Long id;

        @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST,
			CascadeType.MERGE }, mappedBy = "krankenhauser")
	private Set<Arzt> aerzte = new HashSet<>();

	protected Krankenhaus() {
		// dieser Konstruktor wird nicht für die Objekterzeugung verwendet, nur Bean
	}
// Konstruktor mit Parametern und alle Getter und Setter

Die Krankenhaus Tabelle:

+---------------------------+--------------+------+-----+---------+----------------+
| Field                     | Type         | Null | Key | Default | Extra          |
+---------------------------+--------------+------+-----+---------+----------------+
| krankenhaus_id            | bigint(20)   | NO   | PRI | NULL    | auto_increment |
...
+---------------------------+--------------+------+-----+---------+----------------+

Ähnliche Artikel:

  1. Wie kann Boilerplate Code in Java reduziert werden?
  2. Welche Möglichkeiten der Java Objekt-Erzeugung gibt es?
  3. Ecore: Wie kann ein Java Attribut für die Hibernate Suche im Ecore Modell annotiert werden?