Hibernate和JPA - 错误映射通过接口公开的嵌入式类

时间:2009-07-01 20:41:42

标签: hibernate jpa persistence

我们有一组接口,用作API,并从其他模块引用。 这些接口的一组具体实现,对“主”应用程序模块是私有的。这些类带有许多注释(JPA以及用于XML序列化的XStream)。

我遇到了一个问题。我们有一个用户类,其中包含与位置相关的许多字段。我们想把它们放到Address类中。我们希望数据(现在)保留在同一个表中。该方法是一个嵌入式类。

问题是类型签名必须仅引用其他接口以满足它们实现的接口。

当我尝试持久化UserImpl时,我得到了异常:

  

org.hibernate.MappingException:可以   不确定类型:   com.example.Address,at table:User,   对于列:   [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
}

1 个答案:

答案 0 :(得分:13)

您可以使用@Target Hibernate Annotation(这是JPA注释的特定于Hibernate的扩展)

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