2010-08-03 166 views
5

我有一個現有的數據庫,我現在連接到使用休眠。目前我無法更改其中的數據,並且除了單個列以外的所有內容都可以工作。Hibernate枚舉映射使用註釋

我有了值的狀態欄:

  • 郵寄

和列如下映射:

@Column(name = "STATUS", nullable = false, length = 50) 
@Enumerated(EnumType.STRING) 
private TeamMemberStatus status; 

我真的很喜歡(爲了應用的原因)把這個列映射爲Java Enum(TeamMemberStatus),,但是由於'new'是Java中的關鍵字,所以我不能將它作爲enum成員。

如果我有enum contstants NEW,MAILED,IN和OUT hibernate會因EnumType失敗而失敗Enum.valueOf()。

有沒有什麼辦法可以將這個映射到我的Enum而無需編寫複雜的UserType?

- 添加的內容

我的枚舉是這樣的:

public enum TeamMemberStatus { 
    NEW, MAILED, IN, OUT 
} 

是一個有效的Java枚舉,但是不匹配的數據庫的情況。如果我改變以匹配如數據庫:

public enum TeamMemberStatus { 
    new, mailed, in, out 
} 

它不會編譯爲「新」是一個Java保留字。

回答

2

如果你可以在數據庫中使用SQL UPPER聲明,它會工作,而無需使用任何用戶類型

UPDATE

好了,這不可能是最好的解決辦法,但它解決了,你想要什麼

@Entity 
public class WrapperEntity { 

    private TeamMemberStatus memberStatus; 

    @Transient 
    private TeamMemberStatus getMemberStatus() { 
     return this.memberStatus; 
    } 

    public void setMemberStatus(TeamMemberStatus memberStatus) { 
     this.memberStatus = memberStatus; 
    } 

    @Column(name="STATUS", nullable=false, length=50) 
    public String getMemberStatusAsString() { 
     return memberStatus.name().toLowerCase(); 
    } 

    public void setMemberStatusAsString(String memberStatus) { 
     this.setsetMemberStatus(TeamMemberStatus.valueOf(memberStatus.toUpperCase())); 
    } 

}

+0

我假設你的意思是改變數據庫中的數據?像更新TABLE設置狀態=上(狀態)。 我不能這樣做,因爲它會打破與那些希望它爲小寫值的數據交流的現有應用程序。 – stevemac 2010-08-04 00:35:36

+0

@stevemac更新 – 2010-08-04 16:08:01

+0

這就是我最終得出的結果,bascially內部存儲字符串,並將其映射到枚舉當get/set被調用。 這將需要做的短期內,直到我可以讓所有的應用程序更新使用大寫常量。 – stevemac 2010-08-05 04:14:15

1

如果你的數據庫值是「新」,「郵寄」,「在」和「出」,那麼你的Enum需要完全相同的名稱。 - 我相信問題是,你的枚舉是用大寫字母,但是你的數據庫值不是。

+1

這正是這個問題,但我不能有AE num用新的小寫字母,因爲它是java中的保留字。 – stevemac 2010-08-04 00:34:22