2009-07-01 26 views
7

Abbiamo un set di interfacce, utilizzato come API e referenziato da altri moduli. Un insieme di implementazioni concrete di tali interfacce, private del modulo dell'app "principale". Queste classi contengono un numero di annotazioni (JPA e XStream per la serializzazione XML).Hibernate e JPA - Mappatura degli errori Classe integrata esposta tramite un'interfaccia

Ho incontrato un problema. Abbiamo una classe utente con un numero di campi all'interno di esso relativo alla posizione. Vorremmo portarli in classe Address. Vogliamo che i dati (per ora) rimangano nella stessa tabella. L'approccio è una classe incorporata.

Il problema è che le firme del tipo devono fare riferimento solo ad altre interfacce per soddisfare le interfacce che implementano.

Quando provo a persistere un UserImpl, ottengo l'eccezione:

org.hibernate.MappingException: Could non determinare il tipo di: com.example.Address, a tavola: l'utente, per colonne: [org.hibernate.mapping.Column (indirizzo)] codice

Esempio:

interface User { 
    int getId(); 
    String getName(); 
    Address getAddress(); 
} 

@Entity 
class UserImpl implements User { 
    int id; 
    String name; 
    Address address; 

    int getId() { 
     return id; 
    } 

    void setId(int id) { 
     this.id = id; 
    } 

    String getName() { 
     return name; 
    } 

    String setName(String name) { 
     this.name = name; 
    } 

    @Embedded 
    Address getAddress() { 
     return address; 
    } 

    void setAddress(Address address) { 
     this.address = address; 
    } 
} 


interface Address { 
    String getStreet(); 
    String getCity(); 
    String getState(); 
    String getZip(); 
    String getCountry(); 
} 

@Embeddable 
class AddressImpl implements Address { 
    String street; 
    String city; 
    String state; 
    String zip; 
    String country; 

    public String getStreet() { 
     return street; 
    } 

    public String getCity() { 
     return city; 
    } 

    public String getState() { 
     return state; 
    } 

    //... etc 
} 

risposta

13

è possibile utilizzare il @Target Hibernate Annotazione (che è un'estensione Hibernate-specifica per le annotazioni JPA)

@Embedded 
@Target(AddressImpl.class) 
Address getAddress() { 
    return address; 
} 
+0

Grazie, che è davvero una soluzione anche se speravo questo potrebbe essere fatto utilizzando solo JPA. Potrebbe essere utile sapere se questo è possibile con altre implementazioni JPA. –

+0

In base all'eccezione che hai citato, ho pensato che stavi usando Hibernate. Le probabilità sono se fa parte delle Annotazioni Hibernate che non è stato ancora aggiunto alle specifiche JPA. – mtpettyp

+1

Lo siamo, ma sarebbe bello essere neutrali nei confronti del venditore laddove possibile. –