[英]Is it possible to build a JPA entity by extending a POJO?
可以說我有以下POJO:
public class MyThing {
private int myNumber;
private String myData;
//assume getter/setter methods
}
現在可以將此POJO擴展為JPA實體嗎?
@Entity
@Table(name = "my_thing")
public class MyThingEntity extends MyThing implements Serializable {
@Column(name = "my_number")
//?????????
@Column(name = "my_data")
//????????
}
我想讓POJO與JPA實體分開。 POJO生活在一個不同的項目中,並且通常在沒有持久層的情況下使用,我的項目希望將其保存在數據庫中,並且不需要從POJO映射到實體並返回的開銷。
我知道JPA實體是POJO,但是為了使用它,我必須包含一個實現javax.persistence的庫,而使用相同基礎對象的其他項目對於持久層沒有用處。
這可能嗎? 這是一個好主意嗎?
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", 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,如上所示
有可能的:
orm.xml
(符合orm架構 ),並映射POJO的列,甚至不擴展它。 它將在一個環境中啟用JPA,在另一個環境中啟用POJO 也就是說,我認為沒有必要這樣做。 只需注釋您的POJO,並將編譯時依賴項添加到您的項目中。 然后每個項目將決定是否將它們用作JPA實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.