使用注释的Hibernate Enum映射

时间:2010-08-03 12:45:51

标签: java hibernate annotations enums

我有一个现在的数据库,我现在正在使用hibernate连接。我现在无法更改其中的数据,并且只能从一列中完成所有工作。

我有一个状态列,其值为:

  • 邮寄

该列映射如下:

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

我真的希望(出于应用程序的原因)将此列映射为Java Enum(TeamMemberStatus),,但由于'new'是Java中的关键字,我不能拥有作为枚举成员。

如果我有enum contstants NEW,MAILED,IN和OUT hibernate失败,因为在EnumType内部它会执行Enum.valueOf()。

有没有办法让我把它映射到我的Enum而不必编写复杂的UserType?

- 添加内容

My Enum是这样的:

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

是一个有效的Java枚举,但不匹配数据库的情况。如果我更改它以匹配数据库,如:

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

它不会编译,因为'new'是Java保留字。

2 个答案:

答案 0 :(得分:2)

如果您可以在数据库中使用SQL UPPER语句,它将在不使用任何UserType的情况下工作

<强>更新

嗯,它不是最好的解决方案,但它可以解决你想要的问题

@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()));
   }

}

答案 1 :(得分:1)

如果您的数据库值为“new”,“mailed”,“in”和“out”,那么您的Enum需要完全相同的名称。 - 我认为问题在于,您的枚举是大写字母,但数据库值不是。