是否可以通过扩展POJO来构buildJPA实体?
可以说我有以下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注解指定一个类, 其映射信息应用于从其inheritance的实体 。
和
用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如上所示
有可能的:
- 你可以用XML映射它 – build立一个
orm.xml
(符合orm模式 ),并且映射你的POJO的列,甚至不需要扩展它。 它将在一个环境中启用JPA,在另一个环境中启用POJO - 重写只是getter方法和注释他们 – (我不知道这是否会工作)
这就是说,我不认为有必要这样做。 只需注释您的POJO,并将编译时间依赖项添加到您的项目中。 然后每个项目将决定是否将它们用作JPA实体。