作为hibernate可选连接的后续内容
系统中许多现有查询都依赖EntityOne和EntityTwo之间的映射关系,并且更改此关系不是一个吸引人的选择,但是我现在需要开始存储和检索tbl_one.two_id联接表中不存在的值。顺便说一句,这可以与以下映射配合使用:
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
two
EntityTwo
我也尝试了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; ... }
这应该工作:
@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;