java-具有JPA的继承的抽象类(+ 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”中的三列。 这样行吗?

Manius asked 2020-07-30T21:59:24Z
3个解决方案
89 votes

根据JPA 1.0规范:

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

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

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

只需按以下方式定义一个鉴别符列即可:

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

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

@MappedSuperclass
public abstract class RefData {

JPA规范

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

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

Arthur Ronald answered 2020-07-30T22:00:14Z
5 votes

@MappedSuperclass为我工作。 我正在努力将视图映射到父级和子级两个对象。 我的观点是从2个表中加入的。 这两个表中的主键都显示在视图中。 @DiscriminatorColumn对我不起作用,因为它需要专门分配给对象数据类型的列,并且它抛出'repeated Column in object exception'我无法解决。

我阅读了该论坛,并尝试了@MappedSuperclass注释。 它能解决问题。

我将@MappedSuperclass放在超类中,并将@Id和@GeneratedValue放在超类标识符中。 在超视距中,我给出为

@Entity
@Table(name="view_name")

并使用子类对象从视图中获取数据。 而已。

无需使用@DiscriminatorColumn即可在Joined表的休眠注释中进行继承为我工作。

Amirtharaj answered 2020-07-30T22:00:52Z
0 votes

您可以对此使用一种继承策略。 您的案例看起来就像是层次结构的Single类的案例。

检查一下

lalit answered 2020-07-30T22:01:16Z
translate from https://stackoverflow.com:/questions/3827494/inherited-abstract-class-with-jpa-hibernate