JPA规范规定:
实体可以扩展非实体类和实体类,非实体类也可以扩展实体类。
@javax.persistence.MappedSuperclass注解允许您定义此类映射关系。
@MappedSuperclass
public class MyThing implements Serializable {
private int myNumber;
private String myData;
}
而且
@Entity
@Table(name="MY_THING")
public class MyThingEntity extends MyThing {
}
根据JPA规范所述
MappedSuperclass注解指定了一个类,其映射信息应用于继承它的实体。
而且
使用MappedSuperclass注解标记的类可以像实体一样进行映射,只是映射将仅应用于其子类,因为对于映射的超类本身不存在表。
如果需要覆盖MyThing定义的某些属性,请使用@AttributeOverride(当您想要覆盖单个属性时)或@AttributeOverrides(当您想要覆盖多个属性时)
@Entity
@Table(name="MY_THING")
@AttributeOverride(name="myData", column=@Column(name="MY_DATA"))
public class MyThingEntity extends MyThing {
}
并且
@Entity
@Table(name="MY_OTHER_THING")
@AttributeOverrides({
@AttributeOverride(name="myData1", column=@Column(name="MY_DATA_1")),
@AttributeOverride(name="myData2", column=@Column(name="MY_DATA_2"))
})
public class MyOtherThingEntity extends MyThing {
}
如果您不想更改基类,可以使用XML将其定义为@MappedSuperClass。请注意:默认情况下,持久性提供程序将在META-INF目录中查找名为orm.xml的文件。
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
<mapped-superclass class="MyThing">
</mapped-superclass>
</entity-mappings>
只需要这样。如果你想要覆盖一个属性,请像上面所示使用 @AttributeOverride。
@MappedSuperclass MyThingMapper extends MyThing .... MyThingEntity extends MyThingWrapper
。 - FreiheitmyNumber
作为MyThingEntity
的主键,该怎么办? - Manolo Santos