Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用注释休眠枚举映射_Java_Hibernate_Annotations_Enums - Fatal编程技术网

Java 使用注释休眠枚举映射

Java 使用注释休眠枚举映射,java,hibernate,annotations,enums,Java,Hibernate,Annotations,Enums,我现在使用hibernate连接到一个现有数据库。我现在不能更改其中的数据,而让所有内容都在单个列之外工作 我有一个状态列,其中包含以下值: 新的 邮寄 在 出去 列的映射如下所示: @Column(name = "STATUS", nullable = false, length = 50) @Enumerated(EnumType.STRING) private TeamMemberStatus status; 我非常希望(出于应用程序原因)将此列映射为Java Enum(TeamMe

我现在使用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()

我有没有办法不必编写复杂的用户类型就将其映射到我的枚举

--添加内容

我的枚举如下所示:

public enum TeamMemberStatus {
    NEW, MAILED, IN, OUT 
}
是有效的Java枚举,但与数据库的大小写不匹配。如果我将其更改为与数据库匹配,如:

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

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

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

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

更新

嗯,这不是最好的解决办法,但它能解决你想要的问题

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

}

这正是问题所在,但我不能使用小写形式的new值作为枚举,因为它在java中是一个保留字。我假设您的意思是更改数据库中的数据?类似于更新表集status=upper(status)。我不能这样做,因为它会破坏与该数据通信的现有应用程序,这些应用程序希望该数据为小写值。这就是我最后得出的结论,基本上在内部存储字符串,并在调用get/set时将其从/映射到枚举。在我能够更新所有应用程序以使用大写常量之前,它必须在短期内完成。