我有这些实体;
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
答案 0 :(得分:6)
您的映射是错误的。您不能在超类中使用@Id
,然后在子类中添加另一个@Id
。 “id”应唯一标识继承树中的任何对象(“Student”也是“Person”)。
如果你想拥有不同类型的“人”,你可以在Person中增加一个关于他们是否在接受教育的领域。但是看不出它应该如何成为“id”的一部分
错误消息是愚蠢的,并且没有告诉您真正的原因;与Hibernate开发人员合作。
答案 1 :(得分:0)
由于加入了继承类型,这意味着您有一种策略,可以为通过使用外键相互引用的每个类创建一个表。
因此超类必须是@MappedSuperClass 而不是实体