2011-12-10 16 views
7

Sto utilizzando il database MySQL con Hibernate e alcuni campi Enum consentono valori NULL o vuoti. Va tutto bene fino a quando viene effettuata una query e Hibernate tenta di mappare il valore vuoto sull'Enum definito. Non sono in grado di definire un valore in Enum che funzioni, perché Enum consente gli spazi bianchi.Hibernate, MySQL, Enum e NULL

classe Enum:

private enum ObjType { 
    itemA, 
    itemB, 
    NULL 
} 

Ci vuole NULL come membro, ma che non aiuta. Sono nuovo di EE Java e apprezzerei qualsiasi aiuto. Grazie

risposta

2

è possibile aggiungere un valore unknown o default o invalid al tuo enum che verrà mappata nel caso in cui se si tratta di null o empty 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"); 
    } 
} 
} 

Utilizzando fromValue metodo è possibile ottenere l'oggetto enum dal valore. utilizzando il metodo toString è possibile ottenere il valore di un oggetto enum. map conterrà il valore per la mappatura dell'oggetto enum. Se il valore come null o empty space non esiste nella mappa, la mappa restituirà null e in tal caso il metodo fromValue restituirà l'oggetto enum 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()); 
+0

Come si esegue la mappatura? – Loke

+0

aggiunto il codice .. questo è il modo corretto e flessibile di usare un emun. –

+0

Questa sembra una buona soluzione. Grazie. – Loke

3

È possibile utilizzare un valore predefinito per impostare la colonna sul campo enumerazione NULL nell'entità.

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

e aggiornare le righe esistenti.

btw chiamerei i campi enumerati UNKNOWN perché potrebbe essere confuso con il valore NULL DB.

+1

Funzionerà, ma sto cercando una soluzione non intrusiva, per i casi in cui non voglio modificare i dati originali. – Loke