2009-07-01 54 views
7

我們有一組接口,用作API,並從其他模塊引用。 這些接口的一組具體實現,專用於「主」應用程序模塊。這些類包含許多註釋(JPA以及用於XML序列化的XStream)。休眠和JPA - 錯誤映射通過接口公開的嵌入式類

我遇到了問題。我們有一個用戶類,其中有許多與位置有關的字段。我們想將這些轉換爲Address類。我們希望數據(現在)保留在同一個表中。該方法是嵌入式類。

問題是類型簽名只能引用其他接口來滿足它們實現的接口。

當我嘗試堅持一個UserImpl,我得到異常:

org.hibernate.MappingException:難道 無法確定類型: com.example.Address,在表:用戶, 爲列: [org.hibernate.mapping.Column(地址)]

示例代碼:

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 
} 

回答

13

可以使用@Target Hibernate的註釋(這是一個Hibernate特有的擴展,JPA註解)

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

謝謝,這確實是一個解決方案,雖然我希望這可以通過使用僅JPA來完成。可能有助於瞭解其他JPA實現是否可行。 – 2009-07-02 13:05:51