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

时间:2010-09-30 03:30:12

标签: java hibernate jpa annotations

如何在以下示例代码中配置注释?我只想坚持使用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”中的三列。这有用吗?

3 个答案:

答案 0 :(得分:86)

从JPA 1.0规范:

  

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

     

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

如果你想要一个表,你应该使用Single Table继承。

只需按如下方式定义鉴别器列:

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

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

@MappedSuperclass
public abstract class RefData {

JPA规范

  

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

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

答案 1 :(得分:5)

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

我读了这个论坛,我尝试了 @MappedSuperclass 注释。这样做。

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

@Entity
@Table(name="view_name")

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

继承使用 @DiscriminatorColumn 加入表的hibernate注释为我工作。

答案 2 :(得分:0)

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

检查this