JPA規範規定
實體可延伸的非實體類以及實體類,和非實體類可以延伸實體類。
@ javax.persistence.MappedSuperclass註解允許你定義這種映射的
@MappedSuperclass
public class MyThing implements Serializable {
private int myNumber;
private String myData;
// getter's and setter's
}
而且
@Entity
@Table(name="MY_THING")
public class MyThingEntity extends MyThing {
}
正如JPA規範
的MappedSuperclass註釋說指定類別其映射信息應用於從其繼承的實體。
而且
與MappedSuperclass註釋指定一個類可以以同樣的方式映射,只是因爲沒有表存在映射超映射只適用於它的子類實體本身。
如果需要覆蓋由MyThing定義的一些屬性,請使用@AttributeOverride(當你要覆蓋一個屬性)或@AttributeOverrides(當你想要覆蓋不止一個屬性)
@Entity
@Table(name="MY_THING")
@AttributeOverride(name="myData", [email protected](name="MY_DATA"))
public class MyThingEntity extends MyThing {
}
而且
@Entity
@Table(name="MY_OTHER_THING")
@AttributeOverrides({
@AttributeOverride(name="myData1", [email protected](name="MY_DATA_1")),
@AttributeOverride(name="myData2", [email protected](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如上圖所示
我懷疑的想法是不改變MyThing類 – 2010-03-25 15:54:32
馬克西姆是正確的,我不想碰基地POJO的。它可能仍然有效,'@MappedSuperclass MyThingMapper擴展MyThing .... MyThingEntity擴展MyThingWrapper' – Freiheit 2010-03-25 17:34:37
@Freiheit已添加到原始答覆 – 2010-03-25 18:04:57