【问题标题】:Hibernate Enum mapping using annotaions使用注释的休眠枚举映射
【发布时间】:2010-08-03 12:45:51
【问题描述】:

我有一个现有的数据库,我现在正在使用休眠连接。我目前无法更改其中的数据,并且除了单个列之外,所有内容都可以正常工作。

我有一个包含以下值的状态列:

  • 邮寄
  • 出来

并且列映射如下:

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

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

如果我有枚举常量 NEW、MAILED、IN 和 OUT,休眠会在 EnumType 内部失败,它会执行 Enum.valueOf()。

我有什么方法可以将它映射到我的 Enum 而无需编写复杂的 UserType?

--添加的内容

我的枚举是这样的:

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

是一个有效的 Java 枚举,但与数据库的大小写不匹配。如果我将其更改为与数据库匹配,例如:

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

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

【问题讨论】:

    标签: java hibernate annotations enums


    【解决方案1】:

    如果你可以在数据库中使用 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()));
       }
    

    }

    【讨论】:

    • 我假设您的意思是更改数据库中的数据?像更新表设置状态=上(状态)。我不能这样做,因为它会破坏与该数据对话的现有应用程序,这些应用程序期望它是小写值。
    • 这就是我最终解决的问题,基本上在内部存储字符串,并在调用 get/set 时将其映射到枚举。它必须在短期内完成,直到我可以更新所有应用程序以使用大写常量。
    【解决方案2】:

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

    【讨论】:

    • 这正是问题所在,但我不能有一个值 new 小写的枚举,因为它是 java 中的保留字。
    猜你喜欢
    • 2010-10-18
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2015-03-04
    • 2019-06-10
    相关资源
    最近更新 更多