【问题标题】:Spring Boot Hibernate creates tables with wrong namesSpring Boot Hibernate 创建名称错误的表
【发布时间】:2021-10-20 22:33:29
【问题描述】:

当我运行我的项目时,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

User.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:

但我想要@Table 注释中的表名,例如“用户”和“角色”

【问题讨论】:

    标签: java spring-boot hibernate spring-data-jpa


    【解决方案1】:

    熟悉继承策略:

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

    在我看来你正在寻找@MappedSuperclass

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

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

    【讨论】:

    • 谢谢这对我有帮助;)
    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 2016-10-29
    • 2019-03-05
    • 1970-01-01
    • 2017-06-02
    • 2020-07-27
    • 2018-02-25
    • 2017-08-11
    相关资源
    最近更新 更多