我有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列而导致的“可能”。但在我的情况下,我没有鉴别列。
*如何解决这个问题?* 我还可以使用类继承吗?还是另一种解决方法?
感谢。
答案 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;
}