Dies ist ein ähnliches Problem wie "Hibernate @OneToMany ohne separate Join-Tabelle" , da ich eine @OneToMany-Beziehung ohne Join-Tabelle benötige. Ich möchte jedoch auch die inverse Beziehung nicht definieren. Das Entfernen der Inversen scheint zu einer automatischen Generierung einer Join-Tabelle zu führen. Gibt es eine Problemumgehung dafür?
In JPA 2.0+ können Sie @JoinColumn verwenden, um zu vermeiden, dass eine verknüpfte Tabelle generiert wird.
Versuch es.
@OneToMany
@JoinColumn(name="COLUMN_NAME")
UPDATE
Die oben bereitgestellten Informationen wurden aus EJB 3.0 o'reilly book extrahiert (Die Annotation von @JoinColumn verweist auf die Spalte CUSTOMER_ID in der Tabelle PHONE). Die einfache JPA 1.0-Spezifikation unterstützt diese Funktion jedoch nicht. Was es heißt, ist
Unidirektionale One-to-Many-Beziehungen können mithilfe von One-to-Many-Fremdschlüsselzuordnungen implementiert werden. Eine solche Unterstützung ist jedoch in dieser Version nicht erforderlich. Anwendungen, die eine Fremdschlüsselzuordnungsstrategie für Eins-zu-Viele-Beziehungen verwenden möchten sollte diese Beziehungen bidirektional machen, um die Portabilität zu gewährleisten
Also in 1.0 ist dies eine herstellerspezifische Implementierung (Und es macht Sinn, Der Autor arbeitet bei JBoss - Die Red Hat-Abteilung hinter dem Ruhezustand)
Aber wird von JPA 2.0-Implementierung unterstützt
Wenn der Join für ein unidirektionales OneToMany-Mapping mit einer Fremdschlüssel-Mapping-Strategie gilt, befindet sich der Fremdschlüssel in der Tabelle der Zielentität.
Die JPA 1.0-Spezifikation unterstützt NOT unidirektionales OneToMany-Mapping ohne eine Join-Tabelle.
Die Verwendung einer JoinColumn
für eine OneToMany
ist in standard JPA 1.0 nicht zulässig (nur für eine OneToOne
, ManyToOne
oder ManyToMany
). Es ist jedoch in JPA 2.0.
Aus der JPA 1.0-Spezifikation:
2.1.8.5.1 Unidirektionale OneToMany-Beziehungen
Es gelten folgende Mapping-Standardeinstellungen:
Entität A wird einer Tabelle mit dem Namen .__ zugeordnet.
A
. Entität B wird einer Tabelle zugeordnet benanntB
. Es gibt eine Join-Tabelle das heißtA_B
(Eigentümername zuerst). Diese Join-Tabelle hat zwei Fremdschlüsselspalten. Ein Fremdschlüssel Spalte bezieht sich auf die TabelleA
und hat die der gleiche Typ wie der Primärschlüssel der TabelleA
. Der Name dieses Fremdschlüssels Spalte wird als Verkettung gebildet der folgenden: der Name der Entität EIN; "_"; der Name des Primärschlüssels Spalte in der TabelleA
. Das andere fremde Schlüsselspalte bezieht sich auf Tabelle B und hat der gleiche Typ wie der Primärschlüssel von TabelleB
und es gibt einen eindeutigen Schlüssel Zwang darauf. Der Name dieses Fremdschlüsselspalte wird als .__ gebildet. Verkettung der folgenden: die Name der Beziehungseigenschaft oder Feld der Entität A; "_"; der Name von die Primärschlüsselspalte in der TabelleB
.
Zusammenfassend lässt sich sagen, dass Sie, wenn Sie keine Join-Tabelle (und keine vollständige Lese-/Schreibunterstützung) möchten und trotzdem JPA-kompatibel sein möchten, die Assoziation bidirektional machen möchten (mit einer inverse
-Seite).
Der untenstehende Wiki-Buchlink behandelt einen Trick (das Abbilden der Zieltabelle als Verknüpfungstabelle), um das Problem zu "umgehen". Dies funktioniert jedoch nur für Lesevorgänge, Schreibvorgänge funktionieren nicht.
Wenn in der Datenbank keine Join-Tabelle vorhanden ist, wird die Beziehung zwischen zwei Tabellen in der Datenbank durch einen Fremdschlüssel erreicht, der auf den Primärschlüssel verweist. Wenn die Beziehung über PK/FK besteht, muss in der Zielklasse eine Eigenschaft vorhanden sein das bezieht sich auf die Quelle, so dass die FK-Spalte mit einem Wert gefüllt wird. Diese Eigenschaft in der Zielklasse kann eine ID oder ein Quellobjekt sein. Wenn es sich um ein Quellobjekt handelt, müssen Sie eine inverse @ManyToOne in der Zielklasse haben.