hibernate可选join - 需要以任意方式返回join列值

pst*_*ton 6 hibernate

作为hibernate可选join的后续内容

系统中的许多现有查询依赖于EntityOne和EntityTwo之间存在映射关系,并且更改它不是一个attactive选项,但是我现在需要开始存储和检索tbl_one.two_id连接表中不存在的值.在进入的过程中,这适用于以下映射:

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

但是,在查询时,如果结果的值two_id在连接表中不存在,则该字段的two值为null,我无法确定tbl_one.two_id实际值是什么.我希望hibernate会创建一个虚拟EntityTwo对象并仅在关系不存在时填充它的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;
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

基本上我需要一些方法来插入/更新一个值,如果关系存在则tbl_one.two_id检索一个连接的实体EntityTwo,或者只是tbl_one.two_id关系不存在的值.

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

谢谢.

编辑:更多信息

public class EntityTwo
{
    ...
    @Id
    @Column(name = "site_id")
    private String id;
    ...
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

这应该工作:

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

@Formula("two_id")
private String twoId;
Run Code Online (Sandbox Code Playgroud)

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

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

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

@Column("two_id")
private String twoId;
Run Code Online (Sandbox Code Playgroud)