Hibernate 如何将复合键中的单个字段映射为另一个实体的主键

Hibernate 如何将复合键中的单个字段映射为另一个实体的主键,hibernate,spring-data,spring-data-jpa,Hibernate,Spring Data,Spring Data Jpa,我有一个复合键,employee表与address表有一对多的关系 @Embeddable class EmployeeDetails { @Column(name="empid") Long empId; @Column(name="empdept") String empDept; } @Entity class Employee { @EmbeddedId EmployeeDetails empDetails; @OneToOn

我有一个复合键,employee表与address表有一对多的关系

@Embeddable
class EmployeeDetails {
    @Column(name="empid")
    Long empId;
    @Column(name="empdept")
    String empDept;
}

@Entity
class Employee {

    @EmbeddedId
    EmployeeDetails empDetails;

    @OneToOne (mappedBy = "employee")
    Address address;
}

@Entity
class Address {
    String permanentAddrs;
    @Id
    @OneToOne
    @JoinColumn(name = "empId", referencedcolumnname = "empDetails.empid")
    Employee employee;
}
我想做的是将
EmployeeDetails
的empId作为
Address
实体中的主键。 但当我进行上述映射时,我得到以下异常:

org.hibernate.MappingException:在org.hibernate.mapping.Table(employee)及其相关的超表和辅助表中找不到逻辑名称为empDetails.empid的列


上面的映射正确吗?

@Shikhar:在深入研究异常之前,您试图验证的设计中似乎存在一个很大的缺陷

设计似乎有缺陷,为什么?

  • 您在雇员和地址之间以及在地址表中创建了1:M关系 您正在尝试将empId用作主键。 这是完全错误的
  • 您试图实现的是,您希望使用复合键的一列(即empId)作为地址表中的FK。 这在逻辑上是错误的

  • 祝你好运。

    ReferenceColumnName=“empid”我问的问题是一个正在运行的应用程序的简化版本。因此,我不能更改数据库的设计,我不允许这样做。除此之外,现在你能提出更好的建议吗?ShikharChaudhary你会发现使用Hibernate实现这个设计有很多困难,你可以选择mybatis或者spring jdbc。