Как перейти с @OneToOne, который использует @JoinTable, только на @OneToOne?

#spring-boot #hibernate #kotlin #jpa #spring-data-jpa

#весенняя загрузка #спящий режим #kotlin #jpa #spring-data-jpa

Вопрос:

Мы реструктурируем наши сервисы и наши данные. У нас есть 2 объекта Employee , CostCenter

 @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   |
  

Поскольку мы используем @JoinTable в Employee entity, у нас есть 3-я таблица, которая имеет сопоставление между сотрудниками и центрами затрат по имени employee_cost_centers .
таблица employee_cost_centers

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

Теперь мы хотим переместить центры затрат в собственную микросервису. Таким cost_centers образом, таблица также перейдет на новый сервис.
Я хочу сопоставить costCenter ссылку в Employee таблице непосредственно с 3-й таблицей сопоставления 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. Любая помощь от экспертов очень ценится.

Ответ №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
  

или вы можете сохранить имя переменной таким же, в соответствии с вашим дизайном