示例 2:一对一关联,假设源和目标共享相同的主键值。
// On Employee class:
@Entity
public class Employee {
@Id Integer id;
@OneToOne @MapsId
EmployeeInfo info;
...
}
// On EmployeeInfo class:
@Entity
public class EmployeeInfo {
@Id Integer id;
...
}
从 JPA/Hibernate 文档中的这个示例中,它表明两个表中的相同 id 列将被连接。 但是当我尝试这个并执行 empRepository.findById("123") 生成的sql是
从 emp left 中选择 emp.id,在 emp.info_id = emp_info.id 上加入 emp_info
但是在我的数据库列名不是info_id,而是“id”。 如果我显式设置 @MapsId 我会收到以下错误。 创建名称为“entityManagerFactory”的 bean 时出错。实体中的关联被注释为“@MapsId”,但引用了具有显式列映射的属性“id”
因为您的数据库模式似乎具有不同的外键列名称 (
id
)。要解决此问题,您需要使用 EmployeeInfo
注释显式指定 @JoinColumn
实体的列名称。
尝试在
Employee
实体中进行以下更改。
@OneToOne
@JoinColumn(name = "id") // specify mis-matched column name explicitly
EmployeeInfo info;