java - org.hibernate.mapping.JoinedSubclass 无法转换为 org.hibernate.mapping.RootClass

标签 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 cannot be cast to org.hibernate.mapping.RootClass

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

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

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

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

最佳答案

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

如果您想要不同类型的“人”,您可以在“人”中添加一个额外字段,了解他们是否正在接受教育。但不明白它如何成为“id”的一部分

该错误消息很愚蠢,并没有告诉您真正的原因;与 Hibernate 开发人员一起完成这部分工作。

关于java - org.hibernate.mapping.JoinedSubclass 无法转换为 org.hibernate.mapping.RootClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37718753/

相关文章:

java - FirebaseMessagingService 没有在 AsyncTask 的 doInBackground 中被调用

java - 如何将 GCJ 与 Ant 一起使用?

java - 如何在 java 中通过 tcp/ip 网络连接发送用户定义的类对象?

java - hibernate buildSessionFactory类格式错误:

java - JPQL - 带过滤器的 JOIN 查询

java - 如何使用 Hibernate 在 Spring Boot 中处理数据库迁移?

java - Dagger 2 与注入(inject)器类

mysql - 无法检索 Wildfly、Arquillian 设置中的 JPA 实体

java - Hibernate 获取表属性的列表<String>

java - 为什么 JSF + Tomahawk App 会在 MYSQL 数据库中生成全空字段的记录