org.hibernate.mapping.JoinedSubclass无法强制转换为org.hibernate.mapping.RootClass

时间:2016-06-09 06:51:53

标签: java hibernate jpa

我有这些实体;

Person.class

@Entity
@Table(name = "person")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Person implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "person_id")
private long personID;

StudentBean.class

@Entity
@Table(name = "student_information")
public class StudentBean extends Person {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long studentID;

我的目标是将学生记录与Person类和StudentBean类中的详细信息一起保存在1个表中,但我遇到了这些异常

  

org.hibernate.mapping.JoinedSubclass无法强制转换为   org.hibernate.mapping.RootClass

在我的研究中我偶然发现了这个线程[Spring 3.1 Hibernate 4 for inheritance cannot be cast to org.hibernate.mapping.RootClass

基于此,异常的原因是由于Parent和Child类中的@Id。但是如果我在我的任何一个类中删除了@Id,它就不允许我保存对象,因为我的实体没有标识符。

我想要一个人员ID来识别学校外的人和学生证来识别学校里面的人,这可能吗?如果没有,我怎么能删除Person类的PK但仍然可以扩展它并将其保存到另一个表中。

最后,实现此设计的最佳方式是什么,Person可以扩展为Student Class,Teacher Class,SchoolPrincipal Class

2 个答案:

答案 0 :(得分:6)

您的映射是错误的。您不能在超类中使用@Id,然后在子类中添加另一个@Id。 “id”应唯一标识继承树中的任何对象(“Student”也是“Person”)。

如果你想拥有不同类型的“人”,你可以在Person中增加一个关于他们是否在接受教育的领域。但是看不出它应该如何成为“id”的一部分

错误消息是愚蠢的,并且没有告诉您真正的原因;与Hibernate开发人员合作。

答案 1 :(得分:0)

由于加入了继承类型,这意味着您有一种策略,可以为通过使用外键相互引用的每个类创建一个表。

因此超类必须是@MappedSuperClass 而不是实体