具有 JPA 的继承抽象类(+休眠)

2022-08-31 19:47:14

如何在以下示例代码中配置批注?我想只坚持使用JPA注释,并避免Hibernate特定的依赖项。下面的代码是否正确?

@Entity
public class RefExample extends RefData {

}

(这些类将有多个版本,RefSomeOtherExample等,每个类一个数据库表。有些可能会添加其他字段(列),但大多数只会使用从“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”中的三列。这行得通吗?


答案 1

来自 JPA 1.0 规范:

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

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

由于需要单个表,因此应使用“单表”继承。

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

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

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

@MappedSuperclass
public abstract class RefData {

JPA 规范

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

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


答案 2

@MappedSuperclass为我工作。我正在努力将视图映射到2个对象,它们是父类和子类。我的视图是从 2 个表中联接的。视图中同时显示了两个表中的主键。@DiscriminatorColumn对我来说不起作用,因为它需要一个专门分配给对象数据类型的列,并且它还被抛出我无法解决。'repeated Column in object exception'

我读了这个论坛,我尝试@MappedSuperclass注释。它能解决问题。

我在超类中放置了@MappedSuperclass,并将@Id@GeneratedValue放在超类标识符中。在我给出的子lass中

@Entity
@Table(name="view_name")

并使用子类对象从视图获取数据。就是这样。

在联接表的休眠注释中继承,不使用@DiscriminatorColumn对我有用。


推荐