JPA:如何覆盖嵌套@EmbeddedId的列名

问题描述 投票:0回答:1

项目描述

我使用 Spring Boot 3.2.3 以及 KotlinGradle - KotlinJava 21
我使用 Postgres 作为我的数据库。

实际问题

在下面的代码中,我在 Company

Employee
之间创建了一个简单的
OneToMany
关系。
员工的ID
EmployeeId
,它本身包含
CompanyId
employeeName

@Embeddable
data class CompanyId(
    val companyId: Long,
)

@Entity
data class Company(
    @EmbeddedId
    val companyId: CompanyId,
    @OneToMany(mappedBy = "company")
    val employees: List<Employee> = emptyList(),
)

@Embeddable
data class EmployeeId(
    @Embedded
    val companyId: CompanyId,
    val employeeName: String,
)

@Entity
data class Employee(
    @EmbeddedId
    val employeeId: EmployeeId,
    @MapsId("companyId") @ManyToOne
    val company: Company,
)

当我运行项目时,为

Employee
生成的列是
company_company_id
name
,但我宁愿将
company_company_id
覆盖为
company_id

下图再次显示了生成的列

我尝试了什么

我尝试使用

@AttributeOverride

@Embeddable
data class EmployeeId(
    @Embedded
    val companyId: CompanyId,
    val employeeName: String,
)

@Entity
data class Employee(
    @EmbeddedId
    @AttributeOverride(name = "companyId.companyId", column = Column(name = "id"))
    val employeeId: EmployeeId,
    @MapsId("companyId") @ManyToOne
    val company: Company,
)

我的问题

如何覆盖为

EmployeeId
生成的列名称?

java spring-boot kotlin jpa
1个回答
0
投票

我认为这只是你这边的一个小疏忽。覆盖必须是:

@AttributeOverride(name = "employeeId.companyId", column = Column(name = "id"))

名称的第一部分必须是您要应用覆盖的类中的属性的属性名称 - 在本例中为

employeeId

© www.soinside.com 2019 - 2024. All rights reserved.