You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何覆写JPA中嵌套@EmbeddedId的列名?

解决复合主键关联列名重复问题

你遇到的company_company_id列名问题,是JPA对嵌套嵌入式主键的默认命名策略导致的——它会把复合主键里的嵌套ID字段名作为前缀,拼接上嵌套ID自身的列名。下面给你两种可行的解决方法:

方法一:在Employee实体的@EmbeddedId上覆写列名

假设你的复合主键类和实体类基础结构如下:

@Embeddable
data class CompanyId(
    val companyId: Long
)

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

@Entity
data class Company(
    @Id
    val companyId: Long,
    @OneToMany(mappedBy = "id.companyId")
    val employees: List<Employee> = emptyList()
)

在Employee实体中,给@EmbeddedId添加@AttributeOverride,注意要指定完整的字段路径(复合主键字段名.嵌套主键字段名):

@Entity
data class Employee(
    @EmbeddedId
    @AttributeOverride(
        name = "companyId.companyId",
        column = Column(name = "company_id")
    )
    val id: EmployeeId,
    // 其他业务字段
)

这里name = "companyId.companyId"的意思是:修改EmployeeId里的companyId字段下的companyId属性对应的列名,改成company_id。

方法二:直接在复合主键类中指定列名

如果你不想在实体层额外配置,可以直接在EmployeeId的companyId字段上添加@Column注解,直接指定列名:

@Embeddable
data class EmployeeId(
    @Column(name = "company_id")
    val companyId: CompanyId,
    @Column(name = "name")
    val employeeName: String
)

这种方式会直接覆盖JPA的默认命名,生成你想要的company_id列。

关键注意点

  • 确保Company实体中@OneToMany的mappedBy属性正确指向Employee的复合主键路径:mappedBy = "id.companyId"
  • 测试时可以临时设置spring.jpa.hibernate.ddl-auto=create来重新生成表,验证列名是否正确,之后再改回update或none
  • 不要在Employee上额外添加@JoinColumn,否则可能和复合主键的映射冲突

内容的提问来源于stack exchange,提问作者Marc Grec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:25:09