Hibernate 连接继承 - 对象可以是两个子类的实例吗?

问题描述 投票:0回答:1

我在使用 Spring Boot JPA 和 Hibernate 时遇到问题。我有一个数据结构,其中类

Parent
Student
都派生自
User
。他们使用联合继承策略,以便地址等信息存储在
User
Student
Parent
包含特定字段中。
Student
包含一个
parent field
来了解他的父母。它们都共享相同的主键(这就是 Hibernate 处理它的方式)。

如果他自己支付产品费用,

A

User
可以同时是
Parent
Student
。这也很有效,直到
parent field
Student
引用
Parent
的实例。在这种情况下,Spring 从
Student
获取
Student repository
的实例时会显示此错误。

java.lang.IllegalArgumentException: Can not set EntityParent field EntityStudent.parent to EntityStudent

有什么想法导致此错误以及如何避免它吗?代码如下,底层数据库是PostgreSQL:

@MappedSuperclass
public class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    //Getters and setters for id
}


@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.JOINED)
public class EntityUser extends BaseEntity {
    //Other fields, constructor etc.
}

@Entity
@Table(name = "parent")
public class EntityParent extends EntityUser {
    //Other fields, constructor etc.
}

@Entity
@Table(name = "student")
public class EntityStudent extends EntityUser {
    //Other fields, constructor etc.
    @JoinColumn(
            name = "parent_ref",
            nullable = false
    )
    @ManyToOne
    private EntityParent parent;
    //Getters and setters for parent
}

总结:

  • 当 EntityStudent.parent 引用与学生本身不同的父对象时,它会起作用
  • 如果相同,查询学生时会出现如上错误

谢谢您的建议!

java postgresql spring-boot hibernate spring-data-jpa
1个回答
0
投票

这在逻辑上不应该起作用:

A

User
如果他自己支付产品费用,则可以同时是
Parent
Student

Parent
Student
是两个不同的子类,因此如果它们都用于同一个
User
,hibernate将不知道要引用哪一个。您需要的是
Parent
Student
的子类来弥补差距,但这在 Java 中是不可能的。您可以使用一些接口来解决它,但这会使事情变得复杂。

您应该重构您的架构,以免发生这种情况。 我最简单的解决方案是删除层次结构: 只需有从

@OneToOne
Parent
Student
的链接 (
User
)。您需要获得
User
才能访问这些字段,而不是轻松访问它们,但这不应该花费大量时间来重构。

© www.soinside.com 2019 - 2024. All rights reserved.