一尘不染

Hibernate可选联接-需要以两种方式返回联接列值

hibernate

作为hibernate可选连接的后续内容

系统中许多现有查询都依赖EntityOne和EntityTwo之间的映射关系,并且更改此关系不是一个吸引人的选择,但是我现在需要开始存储和检索tbl_one.two_id联接表中不存在的值。顺便说一句,这可以与以下映射配合使用:

@Entity
@Table(name="tbl_one")
public class EntityOne
{
    ....
    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "two_id")
    private EntityTwo two;
    ....
}

..但是,在查询时,如果结果的值two_id在联接表中不存在,则该字段的two值为null,并且我无法告知其tbl_one.two_id实际值。我希望hibernateEntityTwo只在不存在关系的情况下创建一个虚拟对象并填充其id字段。

我也尝试了two_id在没有连接的情况下映射到另一个字段:

@Entity
@Table(name="tbl_one")
public class EntityOne
{
    ....
    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "two_id", insertable = false, updatable = false)
    private EntityTwo two;

    @Column(name = "two_id")
    private String twoId;
    ....
}

…但是two即使相应的记录存在,也永远不会填充该字段。

本质上tbl_one.two_idEntityTwo如果关系存在,或者tbl_one.two_id如果关系不存在,我需要某种方法来插入/更新值,并检索已连接的实体。

我希望能够在不为同一张表创建两个映射的情况下解决此问题。

谢谢。

编辑: 更多信息

public class EntityTwo
{
    ...
    @Id
    @Column(name = "site_id")
    private String id;
    ...
}

阅读 226

收藏
2020-06-20

共1个答案

一尘不染

这应该工作:

@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "two_id", insertable = false, updatable = false)
private EntityTwo two;

@Formula("two_id")
private String twoId;

Hibernate将两次选择two_id列:一次填充两个关系,一次填充twoId。不过,twoId属性是只读的。

您也可以执行相反的操作,但是这两个属性将变为只读:

@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinFormula("two_id")
private EntityTwo two;

@Column("two_id")
private String twoId;
2020-06-20