Hibernate,MySQL,Enum和NULL

时间:2011-12-10 06:07:28

标签: java mysql hibernate enums null

我正在使用带有Hibernate的MySQL数据库,并且某些Enum字段允许NULL或空值。在进行查询并且Hibernate尝试映射Enum定义的空值之前,一切正常。我无法在枚举中定义一个可行的值,因为Enum允许使用空格。

枚举类:

private enum ObjType {
    itemA,
    itemB,
    NULL
}

它需要NULL作为成员,但这没有帮助。我是EE Java的新手,非常感谢任何帮助。 感谢

2 个答案:

答案 0 :(得分:3)

您可以使用默认值将列设置为实体中的NULL枚举字段。

@Enumerated(EnumType.STRING)
@Column(name="obj_type", columnDefinition="char(20) default 'NULL'")
ObjType objType;

并更新现有行。

update table set obj_type='NULL' where obj_type IS NULL

btw我会将枚举字段称为UNKNOWN,因为它可能与DB NULL值混淆。

答案 1 :(得分:3)

您可以在枚举中添加unknowndefaultinvalid值,如果它是nullempty space

package com.test;

import java.util.HashMap;

public class Brand{
    private static HashMap<String,BrandName> map = new HashMap<String,BrandName>();
public enum BrandName {
    HERO("hero"),HONDA("honda"),UNKNOWN("default");

    private String value = null;

     private BrandName(String value){
         this.value = value;
         addToMap();
     }

     private void addToMap(){
         map.put(this.value, this);
     }

     @Override
     public String toString(){
         return this.value;
     }

     public static BrandName fromValue(String value){
         return map.get(value) != null ? map.get(value) : map.get("default");
     }
}
}

使用fromValue方法,您可以从值获取枚举对象。 使用toString方法,您可以获得枚举对象的值。 map将包含枚举对象映射的值。如果地图中不存在nullempty space之类的值,则地图将返回null,在这种情况下,方法fromValue将返回UNKNOWN枚举对象。

System.out.println(Brand.BrandName.HERO.toString());
        System.out.println(Brand.BrandName.fromValue("").toString());
        System.out.println(Brand.BrandName.fromValue(null).toString());
        System.out.println(Brand.BrandName.fromValue("honda").toString());