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
Algarve News vom 17. bis 23. August 2026
wallpaper-1019588
Holz im Interior: Wie Du Wärme in Räume bringst
wallpaper-1019588
[Test] reMarkable Paper Pro vs. Paper Pro Move
wallpaper-1019588
Gewinne zwei Sets von Oliver Untwist – Schluss mit verdrehten Kletterseilen