是否可以通过扩展POJO来构建JPA实体?

时间:2010-03-25 14:31:18

标签: java jpa

假设我有以下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的库,而使用相同基础对象的其他项目对持久层没有用。

这可能吗?这是个好主意吗?

2 个答案:

答案 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)

有可能:

  • 您可以使用XML进行映射 - 制作orm.xml(符合orm schema),并映射POJO的列,甚至不进行扩展。它将在一个环境中启用JPA,在另一个环境中启用POJO
  • 只重写getter方法并注释它们 - (我不确定这是否有用)

那就是说,我认为没有必要这样做。只需注释您的POJO,并将编译时依赖项添加到您的项目中。然后每个项目将决定是否将它们用作JPA实体。