Java 使用注释休眠枚举映射
我现在使用hibernate连接到一个现有数据库。我现在不能更改其中的数据,而让所有内容都在单个列之外工作 我有一个状态列,其中包含以下值: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
- 新的
- 邮寄
- 在
- 出去
@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时将其从/映射到枚举。在我能够更新所有应用程序以使用大写常量之前,它必须在短期内完成。