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

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„:

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

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?

wallpaper-1019588
Die richtige Matratze für erholsamen Schlaf
wallpaper-1019588
[Comic] Fever
wallpaper-1019588
Sanover Anita Pelletofen Test: Die ungeschönte Wahrheit über das Heizen mit Pellets
wallpaper-1019588
IVF Kosten im Ausland: Ländervergleich, reale Gesamtkosten & wann es sich lohnt
wallpaper-1019588
Steinbach Wärmepumpe vs. Intex: Welche Poolheizung lohnt sich in deutschen Gärten wirklich?