首页 > 解决方案 > Spring Boot Hibernate 创建名称错误的表

问题描述

当我运行我的项目时,Hibernate 会自动创建名称错误的表。我有两个表 User 和 Role 以及三个类:抽象类 IdField.java:

@Entity
public abstract class IdField {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    //constructors and getters setters

用户.java 类:

@Entity
@Table(name = "user", schema = "quiz_app")
public class User extends IdField{

    @Column(name = "user_name")
    private String userName;
    @Column(name = "password")
    private String password;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email")
    private String email;

    @ManyToMany(fetch = FetchType.EAGER)
    private Collection<Role> roles = new ArrayList<>();
    //constructors and getters setters

和 Role.java 类:

@Entity
@Table(name = "role", schema = "quiz_app")
public class Role extends IdField{

    @Enumerated(EnumType.ORDINAL)
    @Column(name = "role_name")
    private RoleName roleName;
    //constructors and getters setters

Hibernate 创建了两个名称错误的表,分别为 id_field 和 id_field_roles: 在此处输入图像描述

但我想要像“user”和“role”这样的@Table注释中的表名

标签: javaspring-boothibernatespring-data-jpa

解决方案


熟悉继承策略:

https://thorben-janssen.com/complete-guide-inheritance-strategies-jpa-hibernate/

在我看来,您正在寻找@MappedSuperclass

如果您只想在实体之间共享状态和映射信息,映射超类策略非常适合且易于实现。您只需设置继承结构,注释所有属性的映射信息并将@MappedSuperclass 注释添加到您的超类。如果没有@MappedSuperclass 注解,Hibernate 将忽略你的超类的映射信息。

最重要的是:如果您的共享部分只是 id 字段,顾名思义,继承看起来有点矫枉过正。


推荐阅读