2016-06-30 21 views
6

ich will, ob es möglich ist, einen Verein mit einem abstrakten Entity (das heißt: eine Schnittstelle) zu handhaben, in einem anderen Unternehmen. z. B.
Ich habe eine class namens Foo, die ein Attribut bar hat, das vom Typ Bar ist, der eine interface ist. Mehrere Klassen (Bar1, Bar2) realisieren Bar und sind alle auch persistable.Umgang mit einer Assoziation mit einer Schnittstelle mit ORM in Java

class Foo{ 
    Bar bar; // this will be either Bar1 or Bar2 
} 

interface Bar{ 
    // some methods 
} 

class Bar1 implements Bar{ 
    String s; // Bar1 and Bar2 have different represantations ,hence they must be persisted to different tables 
} 

class Bar2 implements Bar{ 
    int i; 
} 

Nun, wie kann ich das mit einem ORM in Java umgehen? Das heißt, wenn ich eine Foo abrufe, ist es bar ist eine Instanz von einer der Realisierungen von Bar.

+0

Hibernate unterstützt die drei grundlegenden Strategien Vererbung Mapping: 1. Tabelle pro Klassenhierarchie 2. Tabelle pro Unterklasse 3. Tabelle pro Betonklasse – amitmah

+0

beziehen: https://docs.jboss.org /hibernate/orm/3.5/reference/en-US/html/inheritance.html Ich denke, Sie können Schnittstellen in der gleichen Weise wie abstrakte Klassen in Hibernate behandeln. – amitmah

Antwort

4

Ja, können Sie polymorphe Verbände unterstützen, aber Sie werden mit Schnittstellen Bar eine abstract Basis @Entity Klasse anstelle eines interface, als JPA nicht gut funktioniert, zum Beispiel zu machen brauchen:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class Bar { 
    ... 
} 

@Entity 
public class Bar1 extends Bar { 
    private String s; 
    ... 
} 

@Entity 
public class Bar2 extends Bar { 
    private int i; 
    ... 
} 

Wenn Sie modellieren es auf diese Weise, können Sie für Bar Instanzen polymorph mit JP-QL, z select b from Bar.

Referenz:

https://docs.oracle.com/javaee/7/tutorial/persistence-intro002.htm#BNBQN

+0

Die Frage fragt ausdrücklich nach einer Assoziation mit einer ** Schnittstelle **. Das heißt, einer einzelnen Klasse unterschiedliche "Views" zur Verfügung zu stellen, die nicht mit einer abstrakten Klasse erreicht werden können. – user2268997

+0

Die Antwort ist richtig. Wahrscheinlich ist es abhängig vom ORM-Provider. Solange ich für Hibernate weiß, ist es richtig. Es spielt nicht gut mit Interfaces. Um mit der Schnittstelle zu arbeiten, müssen Sie die Implementierungsklasse definieren. Sobald Sie das tun, wird der Polymorphismus zerstört. –

1

Bezug zu cis1 Antwort, aber mit einer einzigen Tabelle.

Die Verwendung von InheritanceType.JOINED erfordert eine Tabelle für die Basisklasse und eine Tabelle pro Unterklasse. Wenn Sie InheritanceType.SINGLE_TABLE mit einem verwenden, können Sie alle Ihre Entitäten in einer einzigen Tabelle speichern und trotzdem in einer einzelnen Sammlung abrufen. Sie können auch DiscriminatorColumn mit InheritanceType.JOINED kombinieren, wenn Sie in der Lage sein möchten, zu ermitteln, welcher Objekttyp in der Basisklasse enthalten ist, während Sie die unterklassenspezifischen Felder in separaten Tabellen beibehalten.

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "DISC") 
public abstract class Bar { 
    ... 
} 

@Entity 
@DiscriminatorValue("BAR1") 
public class Bar1 extends Bar { 
    ... 
} 

@Entity 
@DiscriminatorValue("BAR2") 
public class Bar2 extends Bar { 
    ... 
}