【问题标题】:Hibernate keeps creating tables for my enumsHibernate 不断为我的枚举创建表
【发布时间】:2025-12-09 13:55:02
【问题描述】:

我有两个不同的枚举,它们位于两个不同的表中(它们具有相同的结构,但含义不同)。

这是我的第一个名为 TYPE 的表,来自 FIRST_SCHEMA

id   team   desc              days
1    "AB"   "Do Thins"        2
2    "CD"   "Other things"    3    

这是第二个,称为 TYPE,来自 SECOND_SCHEMA。

id   team   desc                       days
1    "AB"   "Other other thins"        1
2    "CD"   "More and more things"     1

我尝试使用 hibernate 注释在 Java 中映射这个枚举,它们是这样的:

FirstEnum.java

@Entity
@Table(name = "TYPE", schema="FIRST_SCHEMA")
public enum FirstEnum implements SuperEnum<FirstEnum> {

    DO_THINGS(1, "AB", "Do things", 2),
    OTHER_THINGS(2, "CD", "Other things", 3);


    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private final int value;

    @Column(name = "team")
    private final String team;

    @Column(name = "desc")
    private final String dec;

    @Column(name = "days")
    private final int days;

    //getters and setters
}

SecondEnum.java

@Entity
@Table(name = "TYPE", schema="SECOND_SCHEMA")
public enum SecondEnum implements SuperEnum<SecondEnum> {

    DO_THINGS(1, "AB", "Other other thins", 2),
    OTHER_THINGS(2, "CD", "More and more thingsS", 3);


    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private final int value;

    @Column(name = "team")
    private final String team;

    @Column(name = "desc")
    private final String dec;

    @Column(name = "days")
    private final int days;

    //getters and setters
}

使用这些类型之一的类映射如下:

Foo.java

@Table(name = "TABLE", schema="FIRST_SCHEMA")
@Entity
public class Foo extends Bar implements Serializable {
    private static final long serialVersionUID = 1L;


    @Enumerated(EnumType.ORDINAL)
    @Column(name = "id_type")
    private FirstEnum type;

    //getters and setters
}

如果我在我的persistence.xml 中设置该行:

&lt;property name="hibernate.hbm2ddl.auto" value="update" /&gt;

&lt;property name="hibernate.hbm2ddl.auto" value="none" /&gt;

它按预期工作,它不会创建新的“类型”表。但是,如果没有,即使我已经有类型表,它也会创建这个空表。

我映射错了什么?

【问题讨论】:

  • “空表”是什么意思,它叫什么名字?
  • 当我使用“update”参数离开时,hibernate 在“dbo”模式下创建一个名为“type”的新表。
  • 您可以尝试从persistence.xml 中完全删除hibernate.hbm2ddl.auto 属性吗?
  • 我删除了它,显然工作正常,但为什么呢?
  • 其实我还没有找到关于这个特定问题的任何好的参考。我自己也遇到了这个问题,并且知道它是这样工作的。我怀疑这可能是一个错误。但是我再次在文档中没有发现任何关于此的强大内容。为您的问题 +1。

标签: java hibernate enums annotations mapping


【解决方案1】:

首先,枚举用于常量值.. 如果你这样放在表中,还不如创建一个类..

@Entity 
@Data 
@Accessors(chain = true) 
public class FirstEnum {


    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int value;

    @Column(name = "team")
    private String team;

    @Column(name = "desc")
    private String dec;

    @Column(name = "days")
    private int days;

}

枚举功能用于在您的类中拥有恒定的业务逻辑。 所以也许你可以在没有数据库的情况下定义枚举..

public enum SecondEnum {

    DO_THINGS(1, "AB", "Other other thins", 2),
    OTHER_THINGS(2, "CD", "More and more thingsS", 3);
}

【讨论】: