可以说我有以下POJO:
public class MyThing {
private int myNumber;
private String myData;
//assume getter/setter methods
}
Run Code Online (Sandbox Code Playgroud)
现在可以将此POJO扩展为JPA实体吗?
@Entity
@Table(name = "my_thing")
public class MyThingEntity extends MyThing implements Serializable {
@Column(name = "my_number")
//?????????
@Column(name = "my_data")
//????????
}
Run Code Online (Sandbox Code Playgroud)
我想让POJO与JPA实体分开.POJO生活在一个不同的项目中,并且通常在没有持久层的情况下使用,我的项目希望将其保存在数据库中,并且不需要从POJO映射到实体并返回的开销.
我知道JPA实体是POJO,但是为了使用它,我必须包含一个实现javax.persistence的库,而使用相同基础对象的其他项目对于持久层没有用处.
这可能吗?这是一个好主意吗?
Art*_*ald 71
JPA规范说明
实体可以扩展非实体类以及实体类,非实体类可以扩展实体类.
@ javax.persistence.MappedSuperclass注释允许您定义这种映射
@MappedSuperclass
public class MyThing implements Serializable {
private int myNumber;
private String myData;
// getter's and setter's
}
Run Code Online (Sandbox Code Playgroud)
和
@Entity
@Table(name="MY_THING")
public class MyThingEntity extends MyThing {
}
Run Code Online (Sandbox Code Playgroud)
正如JPA规范所述
MappedSuperclass注释指定一个类,其映射信息应用于从其继承的实体.
和
使用MappedSuperclass注释指定的类可以以与实体相同的方式映射,除了映射将仅应用于其子类,因为映射的超类本身不存在表.
如果需要覆盖MyThing定义的某些属性,请使用@AttributeOverride(当您要覆盖单个属性时)或@AttributeOverrides(当您要覆盖多个属性时)
@Entity
@Table(name="MY_THING")
@AttributeOverride(name="myData", column=@Column(name="MY_DATA"))
public class MyThingEntity extends MyThing {
}
Run Code Online (Sandbox Code Playgroud)
和
@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 {
}
Run Code Online (Sandbox Code Playgroud)
如果您不想更改基类,可以使用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>
Run Code Online (Sandbox Code Playgroud)
没有别的.如果要覆盖属性,请使用@AttributeOverride,如上所示