Vererbung Beigetreten Strategie mit mehreren Nicht-Codiert Columns
-
09-10-2019 - |
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!
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ärt9.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 einerOneToOne
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 derJOINED
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"