2012-09-27 14 views
11

Ho le seguenti entità:Entità JPA con un attributo di interfaccia, è possibile?

@Entity 
public class TestCaseStep implements JPAEntity<Integer> { 

     ... 

    @Column(name="STEP_NUMBER") 
    private Integer stepNumber; 

    @Enumerated(EnumType.STRING) 
    @Column(name="ACTION") 
    private Action action; 

    **@ManyToOne 
    @JoinColumn(name="connector") 
    private ScriptItem connector;** 

mio attributo ScriptItem è un'interfaccia per 3 altre classi. È possibile configurare JPA per impostare l'id della classe corretta nell'esecuzione in runtime?

Altre risorse:

public interface ScriptItem { 

    String getValue(); 
    ScriptItemType getType(); 
} 

@Entity 
@Table(name="DAT_FEED_XML") 
public class FeedXml implements JPAEntity<Integer>, ScriptItem { 
    ... 
} 

@Entity 
@Table(name="DAT_DB_STMT") 
public class DbStatement implements JPAEntity<Integer>, ScriptItem { 
     ... 
} 

Quale annotazioni devo usare per far JAP capire che voglio salvare l'id di una delle 3 classi?

Grazie in anticipo,

+1

Sì, ma le tre implementazioni di scriptitem devono ereditare da una Entità di superclasse comune, non solo un'interfaccia comune.(Il tipo di riferimento della proprietà mappata può ancora essere il tipo di interfaccia) – Affe

risposta

7

È davvero una buona idea, ma sfortunatamente mappando direttamente le interfacce come un attributo di entità non è supportato da JPA.

È possibile mappare solo le classi di livello superiore direttamente annotate con @Entity. Questa classe di primo livello può implementare un'interfaccia però.

Questa funzione è stata richiesta e discussed per un lungo periodo.

Anche dare un'occhiata a this e this.

A seconda di ciò che si sta tentando di eseguire, l'annotazione @Inheritance con una strategia table-per-class potrebbe essere un'opzione.

Spero che aiuti.

0

è necessario impostare la vostra eredità di ScriptItem correttamente in JPA utilizzando qualsiasi strategia che preferite (see the docs) e poi JPA sarà intelligenti su di esso.

0

No, non possibile con JPA o Hibernate.

Sembra strano, quando si codifica nel linguaggio Java che consente agli attributi di essere interfacce, che uno standard di persistenza come JPA, destinato a Java, non supporta gli attributi persistenti che sono interfacce.

ho sempre trovato davvero molto frustrante quando il mio ORM mi costringerebbe a refactoring mio 'pura' modello OO solo in modo che si potrebbe persistere esso.

Non è tecnicamente impossibile implementare la persistenza degli attributi di interfaccia, infatti JDO ha supportato la persistenza delle interfacce da sempre ed è per questo che ho iniziato ad usarlo anni fa per tutti i miei progetti.

Sono stato tentato di passare a JPA, non perché sia ​​tecnicamente superiore (anzi, al contrario) ma solo per "mentalità da mandria".

Nel recente lavoro di contratto sono stato costretto a fare esperienza con JPA/Hibernate e, così facendo, ho vissuto i molti limiti e le inefficienze di questa combinazione rispetto a JDO/DataNucleus. Questa è stata una grande esperienza perché mi ha aiutato a placare il mio desiderio di unirmi alla "mandria" :)

Problemi correlati