当前位置: 首页 > 知识库问答 >
问题:

@manytoone在具有复合键的自引用实体中-@idclass,java,hibernate

习洲
2023-03-14

花了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", insertable = false, updatable = false)
    @JoinColumn(name = "last_name", referencedColumnName = "last_name", insertable = false, updatable = false)
    private User parent;

    @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER)
    private Set<User> children;
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class UserCompositeId implements Serializable {
    private Integer id;
    private String firstName;
    private String lastName;
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块中可能存在错误

共有1个答案

姜宏盛
2023-03-14

您需要使用@notfind(action=notfoundaction.ignore)。如果没有记录,那么它将为其分配null。

    @ManyToOne
    @JoinColumn(name = "parent_id", referencedColumnName = "id", insertable = false, updatable = false)
    @JoinColumn(name = "first_name", referencedColumnName = "first_name", insertable = false, updatable = false)
    @JoinColumn(name = "last_name", referencedColumnName = "last_name", insertable = false, updatable = false)
    @NotFound(action=NotFoundAction.IGNORE)
    private User parent;
 类似资料:
  • 我有以下实体: 我第一次使用复合主键,所以我不知道它应该如何工作。问题可能来自定义。第二个参数应该表示ID。但是没有一个主键,而是有两个主键,所以我认为我应该将id类添加到id参数中,但这不起作用。如何使用带有CrudRepository的IdClass键保存具有复合主实体?

  • 我正在尝试使用hibernate解决应用程序中的数据库映射问题。我们使用JPA注释这些类,到目前为止我们是成功的。但是,我们现在想引入一个组合键,它包含一个标识客户的唯一字符串和一个标识数据库条目的字符串。为了设置复合键,我们使用一个名为MandtId.java的IdClass。 然而,我们的映射似乎不起作用,因为它在另一侧找不到要连接的列。 以下是一些代码片段来显示我们的注释: MandtId.

  • 我有一个实体,它的复合主键由两个字段组成,其中一个也是复合外键的一部分。 背景:我有实体<代码>人员 、<代码>区域 和<代码>会话 。 与具有多对多关系,使用称为“和实体。 所以,我有,主键为(,)。本身是的外键。 也有一个字段。我希望(,)是的复合外键。 我的PersonSession代码: } 这看起来不错,它在数据库中创建了所有正确的关系。当我尝试插入个性化会话对象时,问题就出现了——ar

  • 模板实体: 工作流实体: 指挥实体:

  • 问题内容: 我收到以下hibernate异常: 简化的Matchup类如下所示: 简化的Team类如下所示: 笔记: 比赛和团队都有子类。我不确定这是否会影响局势。 我的persistence.xml中列出了Matchup和Team都包括在内。 如果我在两个getter方法上都使用@Transient批注,该错误将消失。 谁能阐明为什么会发生这种异常? 问题答案: 我发现了问题:我没有将Team类