【问题标题】:Enum Mapping in hibernate休眠中的枚举映射
【发布时间】:2011-06-21 02:40:11
【问题描述】:
  public enum Sources {


      SOURCE_MANUAL("manual"),

      SOURCE_RE_EDITING("re editing");


      private String source;

      private Sources(String source){
          this.source = source;
      }

     public String getSource() {
    return source;
     }
    }  


  Mapping in Domain object as
         @Column(name = "SOURCE")
      @Enumerated(EnumType.STRING)
       public Sources getSource() {
          return this.source;
       }

问题:数据库中的源列有值(手动,重新编辑)所以当我尝试加载对象时,我得到以下异常

   Caused by: java.lang.IllegalArgumentException: No enum const class api.domain.Sources.manual
 [java]     at java.lang.Enum.valueOf(Enum.java:214)
 [java]     at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:124)

我在这里做错了吗?

【问题讨论】:

  • 你使用的是什么版本的休眠?我使用的是 3.5.6-Final 版本,无法复制您的问题。
  • 我使用的是 3.5.3 版本

标签: hibernate enums hibernate-mapping


【解决方案1】:

枚举中的source 属性与枚举映射无关。就 Hibernate 而言,您的数据库必须包含值 SOURCE_MANUALSOURCE_RE_EDITING。由于其中一个值包含空格,因此可能无法在不迁移数据库的情况下使用常规枚举映射。可能会有一些技巧,但似乎最好只使用一个字符串进行此映射并手动转换为枚举。

【讨论】:

  • 正确,但没那么有用。如果 Dhirendra 想要将一些任意字符串映射到枚举,最好为此创建一个专门的 UserType。
【解决方案2】:

尝试升级到 Hibernate 版本 3.5.6。

如果这不起作用,您也可以尝试覆盖枚举中的 toString() 方法并返回枚举名称,这并不漂亮,但它应该可以在短期内解决您的问题。

public enum Sources {


  SOURCE_MANUAL("SOURCE_MANUAL", "manual"),

  SOURCE_RE_EDITING("SOURCE_RE_EDITING", "re editing");


  private String source;
  private String enumName;

  private Sources(String enumName, String source){
      this.source = source;
      this.enumName = enumName;
  }

 public String getSource() {
return source;
 }

 public String toString() {
return enumName;
 }

}

【讨论】:

  • 这不起作用,我猜它不会像休眠内部那样休眠休眠正在执行 Enum.valueOf(EnumType.class, "value"),这将失败,因为此“手动”字符串不存在枚举价值。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多