我使用 Spring Boot 3.2.3 以及 Kotlin、Gradle - Kotlin 和 Java 21。
我使用 Postgres 作为我的数据库。
在下面的代码中,我在 Company
和
Employee
之间创建了一个简单的 OneToMany关系。
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
生成的列名称?
我认为这只是你这边的一个小疏忽。覆盖必须是:
@AttributeOverride(name = "employeeId.companyId", column = Column(name = "id"))
名称的第一部分必须是您要应用覆盖的类中的属性的属性名称 - 在本例中为
employeeId
。