带有复合键的自引用实体中的 @ManyToOne - @IdClass、java、hibernate

问题描述

花了 3 天时间寻找解决方案,最后我来到这里寻求社区智慧。

我有如下自引用实体:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@IdClass(CompositeUserId.class)
@Table(name = "user",schema = "dbo")
public class User implements Serializable {
    @Id
    @Column(name = "id")
    private Integer id;

    @Id
    @Column(name = "first_name")
    private String firstName;

    @Id
    @Column(name = "last_name")
    private String lastName;

    @ManyToOne
    @JoinColumn(name = "parent_id",referencedColumnName = "id",insertable = false,updatable = false)
    @JoinColumn(name = "first_name",referencedColumnName = "first_name",updatable = false)
    @JoinColumn(name = "last_name",referencedColumnName = "last_name",updatable = false)
    private User parent;

    @OneToMany(mappedBy = "parent",fetch = FetchType.EAGER)
    private Set<User> children;

我的 CompositeUserId.class:

@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class UserCompositeId implements Serializable {
    private Integer id;
    private String firstName;
    private String lastName;

当我尝试从 user 表中检索所有数据时,出现错误: org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find ...User with id UserCompositeId@19e66569; nested exception is javax.persistence.EntityNotFoundException:

我想 @JoinColumn 块中可能存在某种错误。

这是导致错误的sql查询:

SELECT * 
FROM dbo.user ur1 LEFT OUTER JOIN dbo.user ur2 ON ur1.first_name=ur2.first_name AND ur1.parent_id=ur2.id AND ur1.last_name=ur2.last_name 
WHERE ur1.first_name='First Name' AND ur1.id=130 AND ur1.last_name='Last Name'

我通过手动运行确保请求不会返回数据库中的任何内容,但发现如果我将 id 更改为 parent_id 它将返回数据,所以再次,可能是一些错误在 @JoinColumn

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)