JPA:一个超类的不同列名

Pav*_*l_K 2 java jpa eclipselink

让我们假设,我们有三个类:A,B,C.B扩展A,C扩展A.是否可以(原则上,例如动态地)为以下项设置不同的列名:

  1. B类继承的A类字段
  2. C类中继承的A类字段

我的意思是1和2同时.我用eclipselink.

小智 6

是的,这是可能的,可以通过以下方式完成

@Embeddable public class Address {
        protected String street;
        protected String city;
        protected String state;
        @Embedded protected Zipcode zipcode;
    }

    @Embeddable public class Zipcode {
        protected String zip;
        protected String plusFour;
    }

    @Entity public class Customer {
        @Id protected Integer id;
        protected String name;
        @AttributeOverrides({
            @AttributeOverride(name="state",
                               column=@Column(name="ADDR_STATE")),
            @AttributeOverride(name="zipcode.zip",
                               column=@Column(name="ADDR_ZIP"))
        })
        @Embedded protected Address address;
        ...
    }
Run Code Online (Sandbox Code Playgroud)

它可以应用于扩展映射的超类或嵌入字段或属性的实体,以覆盖由映射的超类或可嵌入类(或其某个属性的可嵌入类)定义的基本映射或id映射.如果未指定AttributeOverride,则列的映射方式与原始映射中的相同.

在下面的示例中,它适用于实体

 @MappedSuperclass
    public class Employee {
        @Id protected Integer id;
        @Version protected Integer version;
        protected String address;
        public Integer getId() { ... }
        public void setId(Integer id) { ... }
        public String getAddress() { ... }
        public void setAddress(String address) { ... }
    }

    @Entity
    @AttributeOverride(name="address", column=@Column(name="ADDR"))
    public class PartTimeEmployee extends Employee {
        // address field mapping overridden to ADDR
        protected Float wage();
        public Float getHourlyWage() { ... }
        public void setHourlyWage(Float wage) { ... }
    }
Run Code Online (Sandbox Code Playgroud)