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
Kurze Fage – Was sind Rauhnächte?
wallpaper-1019588
[Comic] Teenage Mutant Ninja Turtles Splitter Collection [3]
wallpaper-1019588
[Review] Manga ~ Kein Kuss, bevor du 20 bist
wallpaper-1019588
Führt Eltern sein zu mehr Streß oder mehr Lebensfreude?