2011-12-10 71 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