2009-07-01 7 views
7

Nous avons un ensemble d'interfaces, utilisées comme API, et référencées à partir d'autres modules. Un ensemble d'implémentations concrètes de ces interfaces, privées au module d'application "principal". Ces classes portent un certain nombre d'annotations (JPA ainsi que XStream pour la sérialisation XML).Hibernate et JPA - Mappage d'erreurs Classe embarquée exposée via une interface

J'ai rencontré un problème. Nous avons une classe d'utilisateurs avec un certain nombre de champs liés à l'emplacement. Nous aimerions les intégrer dans une classe Address. Nous voulons que les données (pour l'instant) restent dans la même table. L'approche est une classe incorporée.

Le problème est que les signatures de type doivent uniquement faire référence à d'autres interfaces pour satisfaire les interfaces qu'ils implémentent.

Lorsque je tente de persister un UserImpl, je reçois l'exception:

org.hibernate.MappingException: Impossible déterminer le type pour: com.example.Address, à table: l'utilisateur, pour colonnes: [org.hibernate.mapping.Column (adresse)]

Exemple code:

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 
} 

Répondre

13

Vous pouvez utiliser le @Target Hibernate Annotation (qui est une extension spécifique Hibernate aux annotations JPA)

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

Merci, c'est en effet une solution que j'espérais cela pourrait être fait en utilisant uniquement JPA. Pourrait aider à savoir si cela est possible avec d'autres implémentations JPA. –

+0

Selon l'exception que vous avez mentionnée, j'ai supposé que vous utilisiez Hibernate. Les chances sont que si elle fait partie des annotations Hibernate, elle n'a pas encore été ajoutée à la spécification JPA. – mtpettyp

+1

Nous le sommes, mais ce serait bien d'être neutre si possible. –