一尘不染

使用JPA(+ Hibernate)继承的抽象类

hibernate

您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗?

@Entity
public class RefExample extends RefData {

}

(这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“
RefData”基类的基本字段。)

基类:

@Entity
public abstract class RefData {

    private long id;
    private String code;
    private String desc;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    public long getId() {

        return id;
    }

    public void setId(long id) {

        this.id = id;
    }

    @Column(unique = true, nullable = false, length=8)
    public String getCode() {

        return code;
    }

    public void setCode(String code) {

        this.code = code;
    }

    @Column(unique = true, nullable = false, length=80)
    public String getDesc() {

        return desc;
    }

    public void setDesc(String desc) {

        this.desc = desc;
    }
}

最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。在上述情况下,这两个类仅应导致创建一个名为“
RefExample”的表,其中包含“ RefData”中的三列。这样行吗?


阅读 333

收藏
2020-06-20

共1个答案

一尘不染

根据JPA 1.0规范:

抽象类和具体类都可以是实体。 抽象类和具体类均可使用Entity批注进行批注 ,映射为实体,并作为实体进行查询。

实体可以扩展非实体类,非实体类可以扩展实体类

如果需要单个表,则应使用“
单个表”继承。

只需定义一个鉴别符列,如下所示:

@Entity
@DiscriminatorColumn(name="REF_TYPE")
public abstract class RefData {

但是,如果您不想依赖JPA继承策略,则可以改用MappedSuperclass:

@MappedSuperclass
public abstract class RefData {

JPA规范

实体可以从提供持久实体状态和映射信息的超类继承,但它本身不是实体。通常,这种映射超类 的目的 是定义多个实体类共有的状态和映射信息

请记住, 您不能同时 使用@Entity和@MappedSuperclass。

2020-06-20