2016-07-18 2 views
1

Ich frage mich, ob es möglich ist, verschiedene Tabellen zu erstellen, die alle unter PK fallen? Mein Fall ist, dass ich ungefähr 15 verschiedene Arten von Produkten habe. Jede Bestellung kann mehrere Produkte enthalten (notiert in der Many-to-many-Tabelle, in der wir die PK der Bestellung mit der Produkt-PK verbinden, und die dritte Spalte gibt die Menge und die vierte Spalte den Preis an). Ist es jetzt möglich, eine Tabellenstruktur zu erstellen, in der jede Produktkategorie ihre eigene Tabelle hat, aber alle unter eine PK in einer Viele-zu-Viele-Tabelle fallen?Kann eine Vererbung unter einer ID erstellt werden?

Antwort

1

Sicher. Schau dir die JPA inheritance docs an. Es klingt so, als ob Sie entweder eine Unterklassenstrategie oder eine Tabellenhierarchie-Strategie wünschen.

Vereinfachtes Beispiel:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name="DISC") 
public abstract class SuperClass{ 
    // your common fields including primary key 
    @Id 
    private Long myKey; 

    // ... 
} 

@Entity 
@DiscriminatorValue("FOO") 
public class Foo extends SuperClass { 
    // Foo fields. Can be empty, depending on use case 
} 

@Entity 
@DiscriminatorValue("BAR") 
public class Bar extends SuperClass { 
    // Bar fields 
} 

@Entity 
public class MyRelationshipClass { 

    @EmbeddedId 
    private MyKey key; 

    @ManyToOne 
    @JoinColumn(name="order_key") 
    private MyOrder order; 

    @ManyToOne 
    @JoinColumn(name="fooBarKey") 
    private SuperClass fooBar; 
    // other fields omitted 
} 

@Embeddable 
public class MyKey { 
    @Column(name="order_key") 
    private Long order; 

    @Column(name="fooBarKey") 
    private Long fooBarKey; 
} 

In diesem Fall werden Sie mit einem Tisch für Oberklasse mit einer myKey Spalte, eine DISC-Säule, und was auch immer andere gemeinsam genutzte Spalten definieren Sie am Ende. Sie erhalten auch eine Foo- und Bar-Tabelle mit einer myKey-Spalte und den Spalten, die sie in der Unterklasse definieren. Ihre MyRelationshipClass hat eine Tabelle mit einer Spalte für den MyOrder-Schlüssel (die Klasse wurde im Beispiel weggelassen), eine Spalte für den Foo/Bar-myKey und alle anderen von Ihnen definierten Spalten. Sie können die Spalte "Diskriminator" weglassen, wenn Sie dies bevorzugen.

Wenn Sie Foo und Bar in der gleichen Tabelle wie SuperClass wollen, wechseln Sie zu IneheritanceType.SINGLE_TABLE und ansonsten bleibt das Beispiel gleich. Sie müssen in diesem Fall den Diskriminator enthalten. Die Verwendung von JOINED kann Auswirkungen auf die Leistung bei großen Volume-Tabellen oder eine umfangreiche Vererbungszuordnung haben, bietet jedoch eine logischere Trennung der Daten.

Hinweis: Einige JPA-Anbieter (z. B. Ruhezustand) können Sie die Beziehung Zuordnung in der EmbeddedId. nicht alle definieren, so müssen Sie die Beziehung außerhalb der EmbeddedId wie oben definiert.

HTH

Verwandte Themen