OneToMany

Hallo, angenommen es existieren die zwei Tabellen Employe und Department.
Department kann mehrere Employe haben. Die Entity für Department würde dann wie folgt ausehen:

@Entity
public class Department {
@OneToMany(mappedBy="department")
private List<Employe> employes = ...
...
}

Woher weißt JPA, welche Spalte in Employe die Id von Department enthält?
 
Bei bidirektionaler Beziehung nicht oder?


Java:
    Example 1: One-to-Many association using generics

    // In Customer class:

    @OneToMany(cascade=ALL, mappedBy="customer")
    public Set<Order> getOrders() { return orders; }

    In Order class:

    @ManyToOne
    @JoinColumn(name="CUST_ID", nullable=false)
    public Customer getCustomer() { return customer; }

Es gibt kein JoinColumn bei Customer.
 
N

nillehammer

Gast
Doch auch bei bidirektionaler Beziehung und, wenn du etwas nachdenkst, wirst Du feststellen, dass bei
Code:
Customer 1: n Order
die Fremdschlüsselspalte in der DB-Tabelle Order sein muss und dort wahrscheinlich auch ist. Und deswegen in der Java-Welt das @JoinColumn in der Klasse Order steht.
 
Zuletzt bearbeitet von einem Moderator:

KSG9|sebastian

Top Contributor
Nein, für die Datenbank muss kein expliziter ForeignKey definiert werden.

Du musst (in deinem Fall) keine explizite JoinColumn angeben, JPA macht das "automatisch".
Es wird in der Employe-Tabelle eine weitere Spalte angelegt, welche die ID des Departments enthält.

An welche Regeln sich JPA da hält kannst du in der Dokumentation nachsehen. Dank "Convention over Configuration" bzw "Configuration by Exception" musst du nicht mehr alles mögliche angeben was eigentlich eh schon klar ist.
 
N

nillehammer

Gast
Bei einer Beziehung
Code:
Departnment 1 : n Employee
hast Du in der DB-Tabelle Employee eine Fremdschlüsselspalte auf Department. Das wird in JPA durch
Code:
@JoinColumn
angegeben. JPA wird dann automatisch eine Tabellenspalte generieren. Wenn Du bei @JoinColumn den Spaltennamen definierst (hast Du ja schon gemacht), wird JPA diese Spalte benutzen.

Wenn Du @JoinColumn weglässt, wird JPA die Beziehung über eine Beziehungstabelle abbilden, damit die Tabellenstruktur der Entities Department und Employee unangetastet bleibt. Das sind die beiden möglichen Wege. Einen dritten gibt's nicht, weil das in der DB-Welt nunmal auch nicht anders geht.
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Wann manipuliert JPA die Datenbank? Beim Starten des Servers?
Ob überhaupt und wie, hängt von der Implementierung ab. Bei Hibernate bspw. wird das über den Konfigurationsparameter "hibernate.hbm2ddl.auto" gesteuert (kennst Du sicher). Der Zeitpunkt ist der, an dem die Konfiguration geladen wird und die Connection(s) zur DB aufgemacht werden. Ich denke, andere Implementierungen werden das ähnlich machen. Also, ja beim Start des Servers
 

Ähnliche Java Themen


Oben