2011-12-10 39 views
7

我在Hibernate中使用MySQL数据库,并且有一些Enum字段允许NULL或空值。直到查询完成,并且Hibernate试图映射定义的Enum上的空值,这一切都很好。我无法在Enum中定义可以工作的值,因为Enum确实允许使用空格。Hibernate,MySQL,Enum和NULL

枚举类:

private enum ObjType { 
    itemA, 
    itemB, 
    NULL 
} 

它需要NULL作为成员,但没有帮助。我是EE Java新手,希望得到任何帮助。 谢谢

回答

2

您可以在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 enum对象。

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()); 
+0

如何进行映射? – Loke

+0

添加了代码..这是使用emun的正确而灵活的方式。 –

+0

这看起来很不错。谢谢。 – Loke

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,因为它可能会与数据库空值混淆。

+1

它会工作,但我正在寻找一种非侵入式解决方案,以防止我不想修改原始数据的情况。 – Loke