使用hibernate中的枚举值填充数据库表

时间:2011-04-11 15:02:00

标签: hibernate enums

是否有可能让Hibernate(3.6)使用给定枚举的值填充数据库表? 我有以下课程:

@Entity
public enum Role
{
    ROLE_USER_FREE("ROLE_USER_FREE"),
    ROLE_USER_STANDARD("ROLE_USER_STANDARD"),
    ROLE_USER_PREMIUM("ROLE_USER_PREMIUM"),
    ROLE_ADMIN("ROLE_ADMIN");
    ... constructor / setter / getter etc.
}

我可以使用此枚举,而不会出现使用

的其他实体类的任何问题
@Enumerated(EnumType.STRING)
public Role getRole()

我的问题是,如何自动填充相应的表ROLE? 所有底层逻辑和定义都存在于XML规范中。当然,我可以通过XSL从这个规范生成一个sql文件,并让Hibernate在启动时通过import.sql sematic导入它...但是还有更强的优雅方式吗?

表格应如下所示:

|RoleID|RoleName      |
|  0   |ROLE_USER_FREE|
....

2 个答案:

答案 0 :(得分:7)

您必须选择一方 - 要么将Role用作枚举,要么使用实体。你试图做到这两点,这只会导致路上的麻烦。

如果您想使用枚举

  • @Entity删除Role注释。它不是一个实体,它没有主键。它也不应该是可变的,因此坚持它没什么意义。
  • 从数据库中删除Roles(或其所谓的)表。 Hibernate按名称(如果您使用@Enumerated(EnumType.STRING)映射)或values()数组中的索引(如果您使用@Enumerated(EnumType.ORDINAL)注释)持久存储枚举。无论哪种方式,它都不会引用您的附加表。随着您的映射(@Enumerated(EnumType.STRING)),开始使用RoleID毫无意义。

如果您想使用实体

  • 使Role成为真实实体 - 带有getter / setter和标识符的POJO。根据你的需要,它可能是也可能不是可变的。
  • 将其映射到“角色”表格。
  • 从其他表格中将其引用为@ManyToOne
  • 你必须自己填充表格; Hibernate没有内置的方法为你做这件事。

答案 1 :(得分:4)

这会很好地填充我的数据库

public class Person implements UserAccount
{
    public static enum Role
    {
        anon(6), admin(1), standard(4), manager(3), user(5), director(2);
        private int weight;

        Role(int weight)
        {
            this.weight = weight;
        }

        public int weight()
        {
            return weight;
        }
    }

    @ElementCollection(targetClass = Role.class, fetch=FetchType.EAGER)
        @Enumerated(EnumType.STRING) // Possibly optional (I'm not sure) but defaults to ORDINAL.
        @CollectionTable(name="person_roles")
        @Column(name="role") 
    public Set<Role> getRoles()
    {
        return roles;
    }
 ...