繁体   English   中英

如何在使用带有@MapsId 的@OneToOne 映射时强制hibernate 加入

[英]How to force hibernate to do join while using @OneToOne mapping with @MapsId

我有两个实体:

@Entity
@Table(name = "child")
public class MappedChild {
    @Id
    @Column(name = "parent_id")
    private Long parentId;

    @OneToOne
    @PrimaryKeyJoinColumn
    @MapsId
    private MappedParent mappedParent;
}

@Entity
@Table(name = "parent")
public class MappedParent {
    @Id
    @GeneratedValue
    @Column(name = "parent_id")
    private Long parentId;

    @OneToOne(mappedBy = "mappedParent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private MappedChild mappedChild;
}

当我加载MappedChild时,我期待 hibernate 进行 JOIN 以检索MappedParent 但实际上 hibernate 做了两个选择,一个用于MappedChild ,一个用于MappedParent 我试图将子映射更改为下一个:

@Entity
@Table(name = "child")
public class MappedChild {
    @Id
    @GeneratedValue
    @Column(name = "child_id")
    private Long childId;

    @OneToOne
    @JoinColumn("parent_id")
    private MappedParent mappedParent;
}

之后它按预期工作: hibernate 执行 JOIN 而不是两个选择。 但这不是我想要的,我不需要孩子中有两个单独的 id(child_id 和 parent_id),因为这对于我的情况来说是多余的。 我可以修改第一个映射并使 hibernate 做 JOIN 而不是两个选择吗?

对不起,如果我无法正确理解您的问题。 但是从我可以收集的内容来看,您可以尝试使用@Fetch注释。

语法

@Fetch(FetchMode.JOIN)

您可以在您的实体 class 中使用它,例如:

  @OneToOne
    @PrimaryKeyJoinColumn
    @Fetch(FetchMode.JOIN)
    @MapsId
    private MappedParent mappedParent;

此外,我猜@PrimaryKeyJoinColumn在这种情况下是不必要的,因为@MapsId已经完成了这项工作。

如果我理解错了,请让我更深入地了解这个问题。 希望您进一步询问。

谢谢你

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM