系统中的许多现有查询依赖于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;
...
}
答案 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;