【问题标题】:One Table for all enum types in HibernateHibernate 中所有枚举类型的一张表
【发布时间】:2011-08-03 09:17:02
【问题描述】:

我有一个类,让我们说 Employee 如下;

public class Employee{
    ... Other attributes ...
    @Column @Enumerated(EnumType.Ordinal)
    private Gender gender;

    @Column @Enumerated(EnumType.Ordinal)
    private EmployeeType employeeType;
    ... Getters & Setters ...
}

我的 Employee 表是这样的。

Employee{
    ... other columns ....
    gender int,
    employeetype int,
    ...
}

我有一个通用的查找表查找

Lookups{
    id long,
    lookName String,
    lookId int,
    lookValue String
}

我希望 Genders 和 EmployeeTypes 通过 hibernate 保存在 Lookups 表中,如下所示,我该怎么做;

+--+-------------+---------+------------+ 
|ID|LOOKUPNAME   |LOOKUPID | LOOKUPVALUE|
+--+-------------+---------+------------+
+--+-------------+---------+------------+
|1 | GENDER      | 1       | MALE       |
+--+-------------+---------+------------+ 
|2 | GENDER      | 2       | FEMALE     |
+--+-------------+---------+------------+
|3 | EMPLOYEETYPE| 1       | TEAM MEMBER|
+--+-------------+---------+------------+
|4 | EMPLOYEETYPE| 2       | TEAM LEADER|
+--+-------------+---------+------------+
|5 | EMPLOYEETYPE| 3       | MANAGER    | 
+--+-------------+---------+------------+    

【问题讨论】:

    标签: java hibernate enums


    【解决方案1】:

    创建查找类。然后,对于 Employee 类的 Gender 和 EmployeeType 字段,将它们替换为 Lookups 字段。然后删除枚举注释。

    【讨论】:

    • 那么数据将如何发布?
    【解决方案2】:

    我的理解是,您只想以自动方式将所有常量/枚举存储在一个表中。

    为此,您可以拥有

    • 一些 XML/property 文件,将在服务器启动时加载以读取此数据。
    • 该类将在服务器启动时读取属性/XML 文件并检查查找数据是否存在。
      • 如果没有,则将数据持久化到数据库中。
      • 如果有数据,请在 DB 上设置一些标志。如果此标志为真,则启动类将不会在下次服务器启动时再次调用检查。

    这样,启动类可以在启动时检查数据,如果不存在则插入。

    【讨论】:

    • 我怎样才能用hibernate做到这一点。
    • - 要读取属性,您可以使用ResourceBundle。 - 要读取 XML 文件,您可以使用 Spring Bean/XML to Object (Castor/XStream/JAXB 等...) - 启动类需要检查查找表中是否不存在数据(通过检查行数等... .)。然后它需要从 prop/XML 读取数据到 Hibernate 实体并持久化它。 - 有很多可用的例子,这只是你学习它的起点......
    【解决方案3】:

    也许您可以将它们按如下方式组合在一起并持久化?

    import java.util.*;
    enum Gender {
        male, female
    }
    enum EmployeeType {
        member, leader, manager
    }
    class Lookups {
        public String toString() {
            return id + " " + lookName + " " + lookId + " " + lookValue;
        }
        private Lookups(Enum e) {
            id = ++n;
            lookName = e.getClass().getName();
            lookId = e.ordinal() + 1;
            lookValue = e.name();
        }
        private static void create(Enum e) {
            for (Object o : e.getDeclaringClass().getEnumConstants())
                lookups.add(new Lookups((Enum) o));
        }
        final long id;
        final String lookName;
        final int lookId;
        final String lookValue;
        static long n;
        static Set<Lookups> lookups = new LinkedHashSet<Lookups>();
        static {
            create(Gender.values()[0]);
            create(EmployeeType.values()[0]);
        }
    }
    public class Main {
        public static void main(String[] args) {
            for (Lookups lookups : Lookups.lookups)
                System.out.println(lookups);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      相关资源
      最近更新 更多