作为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)
这应该工作:
@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)
| 归档时间: |
|
| 查看次数: |
7808 次 |
| 最近记录: |