【问题标题】:How to migrate from @OneToOne which uses @JoinTable to just @OneToOne?如何从使用@JoinTable 的@OneToOne 迁移到仅使用@OneToOne?
【发布时间】:2021-01-11 18:37:42
【问题描述】:

我们正在重组我们的服务和数据。我们有 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   |

当我们在Employee 实体中使用@JoinTable 时,我们有第三个表,其中包含名称为employee_cost_centers 的员工和成本中心之间的映射。 employee_cost_centers 表

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

现在我们想将成本中心转移到它自己的微服务中。所以cost_centers 表也将移至新服务。 我想通过创建类似的新实体将Employee 表中的costCenter 引用直接映射到第三个映射表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-boot hibernate kotlin jpa spring-data-jpa


    【解决方案1】:

    替换

    @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
    

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

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2011-02-25
      • 2019-06-05
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多