Spring Boot集成Hibernate自动建表名与@Table注解配置不符问题
问题根因
你在抽象公共父类IdField上添加了@Entity注解,会触发Hibernate的实体继承映射规则,默认采用单表继承策略,所有继承该父类的子类实体数据都会存储到以父类名命名的表中,因此你配置在User、Role类上的@Table注解不会生效,同时多对多关联表也会基于父类名生成。
解决方案
步骤1:修改抽象父类注解
将IdField上的@Entity注解替换为@MappedSuperclass,该注解的作用是声明当前类为公共字段映射父类,不会单独生成对应表,类中定义的字段会自动映射到继承它的子类实体表中。
修改后的IdField.java代码如下:
@MappedSuperclass public abstract class IdField { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; // 构造方法、getter、setter保持原有逻辑即可 }
步骤2(可选):自定义多对多关联表名
如果需要指定User和Role的多对多中间表名,避免Hibernate自动生成的表名不符合预期,可以在User类的roles属性上添加@JoinTable注解配置,示例如下:
@ManyToMany(fetch = FetchType.EAGER) @JoinTable( name = "user_role", schema = "quiz_app", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id") ) private Collection<Role> roles = new ArrayList<>();
生效验证
修改完成后重启项目,Hibernate会按照@Table配置生成quiz_app.user、quiz_app.role两张业务表,以及你自定义的中间表quiz_app.user_role,不会再生成id_field、id_field_roles相关的表。
内容的提问来源于stack exchange,提问作者Piotror
相关产品推荐
相关产品推荐

