2011-04-11 75 views
4

有没有可能让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() 

我的问题是,我怎么能自动填充相应的表的作用? 所有基础逻辑和定义都在XML规范中。当然,我可以通过XSL从这个规范生成一个sql文件,让Hibernate在启动时通过import.sql sematic导入这个文件...但是有没有更多优雅的方式?

表应该是这样的:

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

回答

6

你必须选择一方 - 无论你打算使用Role为ENUM或实体。你正在努力做到这一点,这只会导致沿途的麻烦。

如果你想使用枚举

  • Role删除@Entity注解。它不是一个实体,它没有主键。它也不应该是可变的,所以坚持它是没有意义的。
  • 从数据库中删除Roles(或其他所谓的)表。 Hibernate通过名称(如果您使用的是@Enumerated(EnumType.STRING)映射)或values()数组中的索引(如果您使用的是@Enumerated(EnumType.ORDINAL)注释)持续存在枚举。无论哪种方式,它将永远不会引用您的附加表。有了你的映射(@Enumerated(EnumType.STRING)),开头的RoleID毫无意义。

如果你想使用实体

  • Role一个真正的实体 - POJO的getter/setter和标识。它可能会或可能不会变化取决于你想要什么。
  • 将其映射到您的'角色'表。
  • 从其他表中引用它作为@ManyToOne
  • 你必须自己填充表格; Hibernate没有内置的方法来为你做。
+0

“你必须自己填写的表格,有一个为Hibernate来为你做它没有内置的方式。”谢谢。在整个互联网上寻找这个声明,但找不到任何东西..现在我可以停止寻找。一个25K的答案是足够真实的^^ – chzbrgla 2011-05-17 09:17:38

+0

我会提醒不要使用序号,因为它只需要一名初级程序员不知道序数问题,并将其添加到顶部或中间以便为您整理其余的数据库。在枚举本身使用一个常量,可以是一个字符串,也可以使用'int id'字段并坚持。 – corsiKa 2015-11-28 06:47:24

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; 
    } 
...