Frage

Ich habe zwei Klassen Foo und Bar zu zwei verschiedenen Tabellen abgebildet, und ich möchte ihnen die JOINED Vererbungsstrategie verwenden, aber trat zwei Nicht-Schlüsselspalten verwendet wird. Das Schema ist ziemlich komisch, aber ich bin mit ihm stecken. Hier ist mein Setup:

@Entity
@Table(name="foo")
@Inheritance(strategy=InheritanceType.JOINED)
public class Foo {
    @Id
    private Integer uniqueFooId;

    @Column(name="column1")
    private String column1;

    @Column(name="column2")
    private String column2;

    @Column(name="someValue")
    private String someValue;
}

@Entity
@Table(name="bar")
public class Bar extends Foo {
    @Id
    private Integer uniqueBarId;

    @Column(name="column1")
    private String column1;

    @Column(name="column2")
    private String column2;

    @Column(name="someOtherValue")
    private String someOtherValue;
}

Ich bin nicht sicher, wie @Inheritance entscheidet, welche Spalte gegen beitreten zu verwenden, aber ich gehe davon aus standardmäßig verwendet es die Primärschlüssel (n). Ich mag sie verbinden nicht nur gegen eine andere Spalte als Primärschlüssel, sondern zwei, in diesem Fall column1 und column2.

Ich könnte sogar darüber in die falsche Richtung gehen. Ich würde jede mögliche Hilfe oder Vorschläge zu schätzen wissen. Dank!

War es hilfreich?

Lösung

JPA erlaubt nur mehr Tabellen oder vererbten Tabellen durch die Id Spalten verbunden werden. Was JPA-Provider verwenden Sie? Einige bieten andere Optionen.

See, http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keys

Wenn Eclipselink verwenden, können Sie jede Art von definieren verbinden Sie wünschen eine DescriptorCustomizer und addForeignKeyFieldNameForMultipleTable () verwenden.

Andernfalls, wenn Sie nicht das Schema ändern können, könnten Sie versuchen, eine Ansicht erstellen, die die Verbindung ist, und die Verwendung TABLE_PER_CLASS Vererbung und ordnen Sie die Unterklasse der Ansicht.

Andere Tipps

Ich bin nicht sicher, wie @Inheritance entscheidet, welche Spalte gegen beitreten zu verwenden, aber ich gehe davon aus standardmäßig verwendet es die Primärschlüssel (n).

Das ist richtig, und dies wird im folgenden Abschnitt der PPV-1.0-Spezifikation

erklärt

9.1.32 PrimaryKeyJoinColumn Annotation

Die PrimaryKeyJoinColumn Annotation Spezifiziert eine Primärschlüssel-Spalte, die ist als Fremdschlüssel verwendet, um beizutreten eine andere Tabelle.

Die PrimaryKeyJoinColumn Anmerkung ist verwendet, um die primäre Tabelle eines beizutreten Entität Unterklasse im gefügten Mapping Strategie zur Primärtabelle ihrer Superklasse; es wird in einem benutzten SecondaryTable Anmerkung a beitreten Sekundärtabelle in einer Primärtabelle; und es kann in einer OneToOne verwendet werden Kartierung, in dem der Primärschlüssel Die Referenzierung Einheit als verwendet Fremdschlüssel für die referenzierten Einheit.

...

Wenn kein PrimaryKeyJoinColumn Anmerkung für eine Unterklasse angegeben in der JOINED Mapping-Strategie, die Fremdschlüsselspalten werden angenommen haben die gleichen Namen wie der Primärschlüssel Spalten der Primärtabelle des geordneten Klasse.

...

Und die obige Anmerkung (oder PrimaryKeyJoinColumns, wenn Composite-Tasten) gibt Ihnen eine gewisse Kontrolle über die Name der Primärschlüsselspalte der aktuellen Tabelle und Name der Primärschlüsselspalte die Tabelle verbunden werden.

Ich mag sie verbinden nicht nur gegen eine andere Spalte als Primärschlüssel, sondern zwei, in diesem Fall column1 und column2.

Ich bin nicht sicher, ob dies funktionieren wird, aber ich würde die folgende versuchen (in der Unterklasse):

@Entity
@Table(name="bar")
@PrimaryKeyJoinColumns({
    @PrimaryKeyJoinColumn(name="column1",
        referencedColumnName="column1"),
    @PrimaryKeyJoinColumn(name="column2",
        referencedColumnName="column2")
})
public class Bar extends Foo {
    @Id
    private Integer uniqueBarId;

    @Column(name="column1")
    private String column1;

    @Column(name="column2")
    private String column2;

    @Column(name="someOtherValue")
    private String someOtherValue;
}

Ich frage mich, ob die JPA-Provider beschweren oder nicht.

Referenzen

  • JPA 1.0 Spezifikation
    • Abschnitt 9.1.32 "PrimaryKeyJoinColumn Annotation"
    • Abschnitt 9.1.33 "PrimaryKeyJoinColumns Annotation"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top