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

Man*_*ius 44 java annotations hibernate jpa

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

@Entity
public class RefExample extends RefData {

}
Run Code Online (Sandbox Code Playgroud)

(这些类将有多个版本,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我想使用Hibernate的SchemaExport类从中生成模式创建脚本.在上面的情况下,这两个类应该只导致创建一个名为"RefExample"的表,其中包含"RefData"中的三列.这会有用吗?

Art*_*ald 91

从JPA 1.0规范:

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

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

如您所希望的那样,您应该使用单表继承.

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

@Entity
@DiscriminatorColumn(name="REF_TYPE")
public abstract class RefData {
Run Code Online (Sandbox Code Playgroud)

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

@MappedSuperclass
public abstract class RefData {
Run Code Online (Sandbox Code Playgroud)

JPA规范

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

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


小智 5

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

我读了这个论坛,我尝试了@MappedSuperclass注释.它成功了.

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

@Entity
@Table(name="view_name")
Run Code Online (Sandbox Code Playgroud)

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

使用@DiscriminatorColumn对已加入表的hibernate注释进行继承为我工作.