假设我有以下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的库,而使用相同基础对象的其他项目对持久层没有用。
这可能吗?这是个好主意吗?
答案 0 :(得分:70)
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,如上所示
答案 1 :(得分:6)
有可能:
orm.xml
(符合orm schema),并映射POJO的列,甚至不进行扩展。它将在一个环境中启用JPA,在另一个环境中启用POJO 那就是说,我认为没有必要这样做。只需注释您的POJO,并将编译时依赖项添加到您的项目中。然后每个项目将决定是否将它们用作JPA实体。