Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate和JPA-错误映射通过接口公开的嵌入式类_Hibernate_Jpa_Persistence - Fatal编程技术网

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

Hibernate和JPA-错误映射通过接口公开的嵌入式类,hibernate,jpa,persistence,Hibernate,Jpa,Persistence,我们有一组接口,用作API,并从其他模块引用。 这些接口的一组具体实现,专用于“主”应用程序模块。这些类带有大量注释(JPA以及用于XML序列化的XStream) 我遇到了一个问题。我们有一个用户类,其中有许多与位置相关的字段。我们想把它们汇总到Address类中。我们希望数据(目前)保持在同一个表中。该方法是一个嵌入式类 问题是类型签名必须只引用其他接口以满足它们实现的接口 当我尝试持久化UserImpl时,会出现异常: org.hibernate.MappingException:无法 不确

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

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

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

当我尝试持久化UserImpl时,会出现异常:

org.hibernate.MappingException:无法 不确定以下各项的类型: com.example.Address,在表中: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
}
您可以使用Hibernate注释(它是JPA注释的特定于Hibernate的扩展)


谢谢,这确实是一个解决方案,尽管我希望这可以通过只使用JPA来实现。可能有助于了解这是否适用于其他JPA实现。如果它是Hibernate注释的一部分,那么它可能还没有被添加到JPA规范中,但在可能的情况下,最好是与供应商无关。如果接口由枚举类实现,会发生什么?有一个很好的理由说明
@Target
不是JPA的一部分:它只是用来掩盖实体接口,这是一个坏主意和错误。让实体类实现接口的唯一原因是,它所做的不仅仅是设置和获取,那么您的实体设计就不好了。实体接口通常不是一个好主意,YAGNI(几乎,但不是完全相同的事情)。这个案例就是一个很好的例子。
@Embedded
@Target(AddressImpl.class)
Address getAddress() {
    return address;
}