Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen?

Zrebna

Bekanntes Mitglied
Hi!

Angenommen wir habe 2 Jave-Tabellen-Klassen:
1. Lehrer
2. Schule

Bem.: In unserem Modell kann ein Lehrer in beliebig vielen Schulen unterrichten,
so dass zwischen Lehrer und Schule ein N:M-Beziehung besteht.
-> Folglich brauchen wir eine Join-Tabelle zwischen diesen beiden Entitäten, d.h. eine Beziehungstabelle.

Ziel ist es für jede Schule zu speichern, welche Lehrer in dieser unterrichten - hierzu will ich eine Beziehungstabelle verwenden,
die lediglich 2 Attribute haben soll: Lehrer-ID und Schul-ID.

Ich weiß wie ich eine Beziehungstabelle mittels der Hibernate-Annotation @JoinTable erstellen kann.

Ich möchte aber, dass meine Beziehungstabelle auch eine eigene Java-Klasse ist - wie macht man das?

Vereinfachter Code der Java-Klasse 'Schule':
Java:
@Entity
@Table(name = Schule.TABLE)

public class Schule  implements Serializable {

    private static final long serialVersionUID = -6170616881234675372L;
    public static final String TABLE = "schule";

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @Column(name = "name", nullable = false)
    private String name;
    
    // getters and setters
    
    public long getId() {
        return this.id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


Vereinfachter Code der Java-Klasse 'Lehrer':
Java:
@Entity
@Table(name = Lehrer.TABLE)

public class Lehrer implements Serializable {


    private static final long serialVersionUID = -6170616121234675372L;
    public static final String TABLE = "lehrer";
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @Column(name = "nachname", nullable = false)
    private String nachname;

    // getters and setters
  
    public long getId() {
        return this.id;
    }

    public String getNachname() {
        return nachname;
    }

    public void setName(String nachname) {
        this.nachname = nachname;
    }
}

Wie sähe nun eine Beziehungs-Java-Klasse 'Schule_Lehrer' aus?

Ich bin über jede Hilfe dankbar^^

Gruß
Zrebna
 

LimDul

Top Contributor
Meine Erste Frage wäre: Warum will man das?

Wenn man das will, dann legst du eine LehrerSchueler Klasse in Java an.

Und dann hast du folgende beziehungen:

1 zu N von Lehrer zu LehrerSchueler
1 zu N von Schueler zu LehrerSchueler
Keine direkte Beziehung mehr zwischen Lehrer und Schueler.
 

Zrebna

Bekanntes Mitglied
Hi!

Zur ersten Frage:
Berechtigte Frage - ist eher zu Lernzwecken (also ich will einfach wissen, wie es ohne JoinTable-Annotation als eigene Java-Klasse geht) und das Beispiel ist von mir rein konstruiert - daher hier evtl. nicht so sinnvoll.

Aber ok, für den Fall, dass man das wollen würde - wäre dieser Code vom Ansatz korrekt?

Java:
@Entity
@Table(name = LehrerSchueler.TABLE)

public class LehrerSchueler implements Serializable {


    private static final long serialVersionUID = -617061612121275372L;
    public static final String TABLE = "lehrer_schueler";
    
   @Id
   @OneToMany(optional = false, fetch = FetchType.LAZY)
   @JoinColumn(name = "lehrer_id", nullable = false, foreignKey = @ForeignKey(name = "Fk_schueler_lehrer_lehrer"))
   private Lehrer lehrer;
    
   @Id
   @OneToMany(optional = false, fetch = FetchType.LAZY)
   @JoinColumn(name = "schueler_id", nullable = false, foreignKey = @ForeignKey(name = "Fk_lehrer_schueler_schueler"))
   private Schueler schueler;
    
    // getters and setters ...

}

Würde das so gehen?
Dazu 2 Sachen:

1. Die Sache mit dem "foreignKey = ..." habe ich in einem anderem Codesnippet gesehen - ich bin mir nicht sicher, ob man das wirklich benötigt.
2. In dem beobachteten Codesnippet, der ebenfalls eine Jointabelle darstellt (zwischen 2 Entitäten mit n:m-Beziehung) war die Annotation
@ManyToOne statt @OneToMany.
Ist letztere wirklich korrekt?

Danke soweit!

Gruß
Zrebna
 

KonradN

Super-Moderator
Mitarbeiter
Also OneToMany -> Ein Element verweist auf mehrere ... Da würde ich dann ein Set oder List erwarten, denn dein eines Element soll ja auf mehrere andere Elemente verweisen. In eine einzelne Referenz passen ja nicht mehrere!

Bei ManyToOne ist es umgedreht: Mehrere Instanzen Deiner Klasse verweisen auf ein anderes Element. Also hast Du nur eine Referenz.

So wäre eine einfache Ableitung von den Begriffen her.

Man kann dann aber auch einiges an Dokumentation betrachten, z.B.:

Daher ist bei Dir das @OneToMany aus meiner Sicht nicht korrekt (In der anderen Richtung wäre es dann korrekt, wenn Du es nicht bei LehrerSchuler sondern in Schueler oder Lehrer betrachtest).
 

Zrebna

Bekanntes Mitglied
Ok, die Beziehungstabelle soll sein SchuleLehrer.

Der Kontext soll folgender sein:
"Welche n Lehrer unterrichten auf der gerade ausgewählten Schule?"

Für diese ausgewählte Schule gibt es dann also n Lehrer (also eine Liste/Set).

Unabhängig von dem konkreten Kontext ist es aber allgemein so, dass in diesem Modell zwischen Lehrer und Schule eine n:M-Beziehung besteht.
=> Ein Lehrer kann an verschiedenen/mehreren Schulen unterrichten und eine Schule hat beliebig viele Lehrer.

Muss ich mich bei meiner Beziehungstabelle an den allgemeinen Fall (n:m) oder an meinen konkreten Kontext orientieren?
Falls Letzteres der Fall ist, wäre dieser Code korrekt?

Java:
@Entity
@Table(name = LehrerSchule.TABLE)

public class LehrerSchule implements Serializable {

    private static final long serialVersionUID = -617061612121275372L;
    public static final String TABLE = "lehrer_schule";
    
   @Id
   @ManyToOne(optional = false, fetch = FetchType.LAZY)
   @JoinColumn(name = "schul_id", nullable = false, foreignKey = @ForeignKey(name = "Fk_lehrer_schule_schule"))
   private Schule schule;
    
   @Id
   @OneToMany(optional = false, fetch = FetchType.LAZY)
   @JoinColumn(name = "lehrer_id", nullable = false, foreignKey = @ForeignKey(name = "Fk_schule_lehrer_lehrer"))
   private List<Lehrer> lehrer;
      
    // getters and setters ...

}

Und braucht man den FK-codeSnippet?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Hibernate n:m mittels Zwischentabelle und bidirektionaler Zugriff Datenbankprogrammierung 2
Zrebna Wie mittels PL/SQL eine Datenbankverbindung blockieren? Datenbankprogrammierung 6
Zrebna Lediglich interne DB-Verbindungen (Connections) auslesen - mittels Java Datenbankprogrammierung 4
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
G Laufzeit Bestimmung mittels Landau Symbolic Datenbankprogrammierung 13
G Laufzeit eines Algorithmus mittels Big Theta bestimmen Datenbankprogrammierung 5
P Mittels Java einen neuen MySQL User erstellen Datenbankprogrammierung 4
A Problem mit Eintragen von Daten in eine Datenbank mittels DAO Datenbankprogrammierung 4
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
T Mittels SQL-String ein Berechnung vornehmen Datenbankprogrammierung 2
D Mittels JUnit Reihe von DAOs testen Datenbankprogrammierung 10
J MYSQL-Zugriff mittels einer Java-Bean Datenbankprogrammierung 42
K Zugriff mittels JDBC funktioniert nur lokal Datenbankprogrammierung 5
M Mysql datenbank auslesen und mittels servlet wiedergeben Datenbankprogrammierung 3
W Problem bei Connection mit SQLServer-Datenbanke mittels Java Datenbankprogrammierung 2
K Stored Procedures, mittels Java Datenbankprogrammierung 8
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben