2010-08-03 158 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