webentwicklung-frage-antwort-db.com.de

@OneToMany ohne inverse Beziehung und ohne Join-Tabelle?

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?

33
jsight

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.

50
Arthur Ronald

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 benannt B. Es gibt eine Join-Tabelle das heißt A_B (Eigentümername zuerst). Diese Join-Tabelle hat zwei Fremdschlüsselspalten. Ein Fremdschlüssel Spalte bezieht sich auf die Tabelle A und hat die der gleiche Typ wie der Primärschlüssel der Tabelle A. 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 Tabelle A. Das andere fremde Schlüsselspalte bezieht sich auf Tabelle B und hat der gleiche Typ wie der Primärschlüssel von Tabelle B 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 Tabelle B.

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.

Verweise

15
Pascal Thivent

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.

0
dinesh ranawat