首页 > 解决方案 > 如何从使用@JoinTable 的@OneToOne 迁移到仅使用@OneToOne?

问题描述

我们正在重组我们的服务和数据。我们有 2 个实体EmployeeCostCenter

@Entity
@Table(name = "employees")
data class Employee(
    @Id
    val id: Long? = null,

    @Column(name = "id_dept")
    val departmentId: Long,

    @Column(name = "business_email_address")
    var businessEmailAddress: String? = null,

    @OneToOne
    @JoinTable(
        name = "employee_cost_centers",
        joinColumns = [JoinColumn(
            name = "employee_id",
            referencedColumnName = "id"
        )]
    )
    @JoinColumn(name = "cost_center_id")
    var costCenter: CostCenter? = null
)
@Entity
@Table(name = "cost_centers")
data class CostCentre(
    @Id
    val id: Long,
    
    @Column
    var name: String? = null,

    @Column(name = "deleted")
    var isDeleted: Boolean = false
)

员工表

| id | id_dept     | business_email_address |
|----|-------------|------------------------|
| 1  | Finance     | finance@example.com    |
| 2  | HR          | hr@example.com         |
| 3  | Development | dev@example.com        |
| 4  | Marketing   | marketing@example.com  |

cost_centers 表

| id  | name                  | deleted |
|-----|-----------------------|---------|
| 10  | FinanceCostCenter     | false   |
| 20  | HRCostCenter          | false   |
| 30  | DevelopmentCostCenter | false   |
| 40  | MarketingCostCenter   | false   |

正如我们@JoinTableEmployee实体中使用的那样,我们有一个第三张表,其中包含员工和成本中心之间的映射,名称为employee_cost_centers。employee_cost_centers 表

| cost_center_id | employee_id |
|----------------|-------------|
| 10             | 1           |
| 20             | 2           |
| 30             | 3           |
| 40             | 4           |

现在我们想将成本中心转移到它自己的微服务中。所以cost_centers表也将移至新服务。我想通过创建一个类似的新实体将表中的costCenter引用Employee直接映射到第三个映射表employee_cost_centers

@Entity
@Table(name = "employee_cost_centers")
data class EmployeeCostCenter(
    @Id
    @Column(name="cost_center_id")
    val costCenterid: Long,

    @Column(name="employee_id")
    val employeeId: Long
)

但是我应该如何在Employee实体中映射它?我对 JPA/Hibernate 相当陌生。非常感谢专家的任何帮助。

标签: spring-boothibernatekotlinjpaspring-data-jpa

解决方案


代替

@OneToOne
    @JoinTable(
        name = "employee_cost_centers",
        joinColumns = [JoinColumn(
            name = "employee_id",
            referencedColumnName = "id"
        )]
    )
    @JoinColumn(name = "cost_center_id")
    var costCenter: CostCenter? = null

经过

@OneToOne
    @JoinColumns([JoinColumn(
            name = "employee_id",
            referencedColumnName = "id"
        )])
    var employeeCostCenter: EmployeeCostCenter? = null

或者您可以根据您的设计保持变量名称相同


推荐阅读