繁体   English   中英

JPA实体映射继承

[英]JPA Entity Mapping Inheritance

我对JPA实体映射有疑问。 我有一些课:

A类

@Entity
public class ClassA {

private int id;

@OneToMany
private List<ClassB> listClassB;
}

B级

@Entity
public class ClassB {

private int id;

@ManyToOne
private ClassA classA;

@OneToMany
private List<ClassC> listClassC;
}

C类

@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的编号)。 当我像这样使用类继承时:

E级

@Entity
public Class ClassE extends ClassC {

    // All ClassC properties

    private Long numberOfClassD;
}

它抛出com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“ pegawai0_.DTYPE”。 缺少“鉴别符”列导致“可能”。 但就我而言,我没有区分列。

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

谢谢。

在该示例中,ClassC和ClassE均已标记有@Entity,因此使用了“按类分类的表”继承策略。 默认情况下,区分符列名称为“ DTYPE”。

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

您可能想根据域模型检查所需的继承策略。 该链接将是对此的很好指南: http : //docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch10.html

就像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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM