我使用Hibernate作为ORM实现的Spring Data JPA后端。
这是模型:
__________ _________________________
|Person | |MailConfig |
|________| |_______________________|
| id PK | | uid PK-FK(Person.uid) |
| uid | | ... |
| ... | | |
|________| |_______________________|
@Entity
@Table(name="Person")
public class PersonEntity{
@Id
private String id;
private String uid;
@OneToOne(mappedBy="id", fetch=FetchType.EAGER)
private MailConfigEntity mailConfigNotes;
...
}
@Entity
@Table(name="MailConfig")
public class MailConfigEntity implements Serializable{
@Id
@OneToOne
@JoinColumn(name="uid", table="Person", referencedColumnName="uid", insertable = false, updatable = false)
private PersonEntity id;
...
}
Person表通过不是Person的主键的字段与MailConfig表连接。当我使用personDAO.findOne(id)
加载实体时,我可以看到查询中的连接是针对person.id而不是person.uid(on personent0_.id=mailconfig2_.uid
)执行的。知道为什么这不起作用吗?
查询日志:
select
personent0_.id as id8_2_,
personent0_.uid as uid8_2_,
mailconfig2_.uid as uid5_1_
from
Person personent0_
left outer join
mailconfig mailconfig2_
on personent0_.id=mailconfig2_.uid
where
personent0_.id=?
答案 0 :(得分:0)
根据文档,检查这是否是外键
一对一协会有三种情况:要么是 关联实体共享相同的主键值,即外键 由其中一个实体持有(注意这个FK列中的 数据库应该被约束为模拟一对一的唯一 multiplicity),或关联表用于存储链接 在两个实体之间(必须在每个实体上定义唯一约束) fk确保一对一的多重性。)
此外,JoinColumn应位于关系的所有者一侧