如何在父级中定义Hibernate OneToOne单向Map,其中FK列位于子级中?

5kgi1eie  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(111)

背景:我正在升级到Hibernate 6.1.4(从5.3.x)的过程中,遇到了OneToOne双向Map的问题(这 * 看起来 * 是一个bug,我已经写了下来)。我正在寻找一个不需要更改模式的解决方案,并考虑使Map单向化,但遇到了一个问题。
下面是一个简化的起点:

@Entity
@Table(name = "PARENT_T")
public class Parent {
    @Id
    @Column(name = "PARENT_PK")
    private Integer id;

    @OneToOne(targetEntity = Child.class, mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Child child;

    // getters and setters...
}

@Entity
@Table(name = "PARENT_T")
public class Child {
    @Id
    @Column(name = "CHILD_PK")
    private Integer id;

    @OneToOne(targetEntity = Parent.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "PARENT_FK", nullable = false)
    private Parent parent;

    // getters and setters...
}

因此,我想删除Child-to-ParentMap,只Map属性:

@Column(name = "PARENT_FK", nullable = false)
    private Long parentFK;

但是,这意味着Parent中的mappedBy = "parent"不再有效。我可以添加一个JoinColumn注解,但是根据文档,JoinColumn名称位于源实体(此处为Parent)中:
外键列的名称。在哪个表中找到该列取决于上下文。
如果联接是针对使用外键Map策略的OneToOne或ManyToOneMap,则外键列位于源实体的表中或可嵌入。
我看到了使用一对多Map的建议,因为:
如果连接是针对使用外键Map策略的单向OneToManyMap,则外键位于目标实体的表中。
...然后将其视为一对一。但是,这看起来像是一个杂七杂八的东西。
因此:是否有方法将外键列所在的OneToOne关系Map到目标实体(此处:子),而不是源(这里:母)?
从概念上讲,我只是在注解中寻找与mappedBy等效的表,类似于:@一对一(目标实体=子级.类,Map依据列=“父级FK”,级联=级联类型.ALL,获取=获取类型.LAZY)
谢谢你!

nwo49xxi

nwo49xxi1#

请在此处尝试此Map:

@MapsId
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_PK", referencedColumnName = "PARENT_FK")
private Child child;

相关问题