JPA实体映射继承

时间:2015-05-21 04:17:48

标签: java hibernate jpa inheritance

我有JPA实体映射的问题。我有一些课程:

ClassA的

@Entity
public class ClassA {

private int id;

@OneToMany
private List<ClassB> listClassB;
}

ClassB的

@Entity
public class ClassB {

private int id;

@ManyToOne
private ClassA classA;

@OneToMany
private List<ClassC> listClassC;
}

ClassC

@Entity
public class ClassC {

private int id;

@ManyToOne
private ClassB classB;

    private String code;
    private String name;

@OneToMany
private List<ClassD> listClassD;
}

D类

@Entity
public class ClassD {
    private int id;
    private Long value;
    private Date startDate;
    private Date finishDate;

@ManyToOne
    private ClassC classC;
}

现在,我希望拥有另一个拥有ClassC所有属性和关联的实体,并拥有它自己的属性(该值是与Class C相关的ClassD数)。当我像这样使用类继承时:

CLASSE

@Entity
public Class ClassE extends ClassC {

    // All ClassC properties

    private Long numberOfClassD;
}

它抛出com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:'字段列表'中的未知列'pegawai0_.DTYPE'。 由于缺少Discriminator列而导致的“可能”。但在我的情况下,我没有鉴别列。

*如何解决这个问题?* 我还可以使用类继承吗?还是另一种解决方法?

感谢。

2 个答案:

答案 0 :(得分:0)

在这个例子中,ClassC&amp; ClassE已使用@Entity标记,因此使用了“每个类的层次结构”继承策略。默认情况下,鉴别器列名称为“DTYPE”。

您可以尝试使用'ClassC'上的'每个类的表'层次结构策略。但是,生成的表与“每个类的层次结构”有很大的不同。

您可能希望根据域模型检查所需的继承策略。这个链接可以很好地指导: http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch10.html

答案 1 :(得分:0)

就像Alan Hay在评论中所建议的那样,ClassC和ClassE在数据库中没有任何关系。因此,使用@MappedSuperclass解决问题。

我这样实现:

@MappedSuperclass
public Class SuperClass {

    private int id;

    @ManyToOne
    private ClassB classB;

    private String code;
    private String name;

    @OneToMany
    private List<ClassD> listClassD;

}

@Entity
@Table(name = "table_name")
public Class ClassC extends SuperClass {

    // No Property

}

@Entity
@Table(name = "table_name")
public Class ClassE extends SupperClass {

    private String classECustomValue;

}