我在使用 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
}
总结:
谢谢您的建议!
这在逻辑上不应该起作用:
A
如果他自己支付产品费用,则可以同时是User
和Parent
。Student
Parent
和Student
是两个不同的子类,因此如果它们都用于同一个User
,hibernate将不知道要引用哪一个。您需要的是 Parent
和 Student
的子类来弥补差距,但这在 Java 中是不可能的。您可以使用一些接口来解决它,但这会使事情变得复杂。
您应该重构您的架构,以免发生这种情况。 我最简单的解决方案是删除层次结构: 只需有从
@OneToOne
和 Parent
到 Student
的链接 (User
)。您需要获得 User
才能访问这些字段,而不是轻松访问它们,但这不应该花费大量时间来重构。