繁体   English   中英

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

[英]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,如上所示

有可能的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM