代码之家  ›  专栏  ›  技术社区  ›  itsadok

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

  •  7
  • itsadok  · 技术社区  · 15 年前

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

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

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

    当我尝试持久化一个userimpl时,我得到一个异常:

    org.hibernate.mappingException:可以 不确定类型: com.example.address,at table:用户, 列: [组织.休眠.映射.列(地址)]

    示例代码:

    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 回复  |  直到 11 年前
        1
  •  13
  •   mtpettyp    11 年前

    你可以使用 @Target Hibernate注释(它是JPA注释的Hibernate特定扩展)

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