2016-06-30 44 views
6

voglio se è possibile gestire un associazione con una astratto Entity (cioè: un Interface), in un'altra entità. ad esempio:
Ho un class chiamato Foo che ha un attributo bar, che è di tipo Bar, che è un interface. Le classi multiple (Bar1, Bar2) realizzano Bar e sono tutte anche persistente.Handling un'associazione con un'interfaccia con 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; 
} 

Ora come posso gestirlo con un ORM in Java? Ad esempio: in modo che quando richiamo un Foo, è bar è un'istanza di una delle realizzazioni di Bar.

+0

Hibernate supporta le tre fondamentali strategie di mappatura eredità: 1. tabella per gerarchia di classi 2. tabella per ogni sottoclasse 3. tabella per ogni classe concreta – amitmah

+0

riferimento: https://docs.jboss.org /hibernate/orm/3.5/reference/en-US/html/inheritance.html Penso che sia possibile gestire le interfacce allo stesso modo delle classi Abstract in Hibernate. – amitmah

risposta

4

Sì, è possibile sostenere le associazioni polimorfiche, ma avrete bisogno di fare un Barabstract base di @Entity classe invece di un interface, come APP non funziona bene con le interfacce, ad esempio:

@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; 
    ... 
} 

Se lo modellate in questo modo, sarete in grado di eseguire query per le istanze Bar in modo polimorfico utilizzando JP-QL, ad esempio select b from Bar.

Riferimento:

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

+0

La domanda richiede specificamente un'associazione con ** un'interfaccia **. Ovvero, per fornire diverse "viste" a una singola classe, che non può essere realizzata usando una classe astratta. – user2268997

+0

La risposta è corretta. Probabilmente dipende dal provider ORM. Finché so per Hibernate è corretto. Non funziona bene con le interfacce. Per lavorare con l'interfaccia è necessario definire la classe di implementazione. Una volta fatto il polimorfismo viene distrutto. –

1

correlati alla risposta di CK1, ma con un unico tavolo.

L'utilizzo di InheritanceType.JOINED richiede una tabella per la classe base e una tabella per sottoclasse. Se si utilizza con uno DiscriminatorColumn, è possibile memorizzare tutte le entità in un'unica tabella e recuperarle in un'unica raccolta. È anche possibile combinare lo DiscriminatorColumn con InheritanceType.JOINED se si desidera essere in grado di dire quale tipo di oggetto si trova nella classe base, mantenendo i campi specifici della sottoclasse in tabelle separate.

@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 { 
    ... 
}