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

时间:2011-03-10 07:58:23

标签: hibernate

作为hibernate optional 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;
    ....
}

..但是在查询时,如果结果的值two_id在联接表中不存在,则字段two的值为空,我无法告诉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;
    ....
}

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

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

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

感谢。

编辑:更多信息

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

1 个答案:

答案 0 :(得分:4)

这应该有效:

@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;