实体类与表名不同时@ManyToMany关联表无法创建唯一键约束问题
问题根源
你的思路部分正确,@Table(name="user")确实会告知JPA主表名称为user,但你忽略了一个配置规则:关联表的外键列名默认命名规则是实体类名+下划线+主键属性名,而非主表名+主键名。
你当前的@JoinTable注解只显式指定了关联对端(Role)的外键列role_id,没有显式指定当前UserEntity端的外键列名,Hibernate会根据实体类名UserEntity和主键名id,默认生成关联表外键列名为user_entity_id,和你在唯一约束里写的user_id不匹配,所以抛出列找不到的异常。
你之前将实体类命名为User时,默认生成的外键列是user_id,和唯一约束配置匹配,所以运行正常。移除唯一约束配置后,Hibernate不会校验你自定义的列名,所以HSQL测试能运行,但此时实际生成的关联表外键列还是user_entity_id,部署到实际MariaDB环境时依然会因为列不匹配报错。
解决方案
最稳妥的方式是在@JoinTable中显式指定当前端的外键列名,和数据库实际列名保持一致,修改后的注解配置如下:
@ManyToMany(fetch = FetchType.EAGER) @JoinTable( name = "user_role", // 显式指定当前UserEntity端在关联表中的外键列名 joinColumns = @JoinColumn( name = "user_id", foreignKey = @ForeignKey(name = "FK_user_role_user_id") ), inverseJoinColumns = @JoinColumn( name = "role_id", foreignKey = @ForeignKey(name = "FK_user_role_role_id") ), uniqueConstraints = @UniqueConstraint( name = "UK_user_role_user_id_role_id", columnNames = {"user_id", "role_id"} ) ) private List<Role> roles;
修改后不管是HSQL测试还是实际MariaDB部署,都会按照你指定的列名生成表结构,不会再出现列找不到的问题。
内容的提问来源于stack exchange,提问作者DaithiG
相关产品推荐
相关产品推荐

