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
Futter für Breitrandschildkröten: Was darf ins Gehege?
wallpaper-1019588
Bischkek Sehenswürdigkeiten: Unsere Stadttour durch Kirgistans grüne Hauptstadt
wallpaper-1019588
Burana Turm und Konorchek Canyon: Unsere Tagestour ab Bischkek
wallpaper-1019588
Die Welt im Detail: Makrofotografie am Handy neu entdecken