如何覆写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
相关产品推荐
相关产品推荐

