2011-04-11 123 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; 
    } 
...