Hibernate, MySQL, Enum и NULL - PullRequest
       18

Hibernate, MySQL, Enum и NULL

8 голосов
/ 10 декабря 2011

Я использую базу данных MySQL с Hibernate, и есть определенные поля Enum, которые допускают NULL или пустые значения.Все в порядке, пока не будет выполнен запрос, и Hibernate попытается отобразить пустое значение в определенном Enum.Я не могу определить значение в Enum, которое будет работать, потому что Enum разрешает пробелы.

Класс Enum:

private enum ObjType {
    itemA,
    itemB,
    NULL
}

Он принимает значение NULL как член, но это не помогает,Я новичок в EE Java, и был бы признателен за любую помощь.Спасибо

Ответы [ 2 ]

3 голосов
/ 10 декабря 2011

Вы можете добавить значение unknown или default или invalid к вашему перечислению, которое будет отображаться в случае, если оно null или 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");
     }
}
}

Использование fromValue метод, вы можете получить объект enum из значения.используя метод toString, вы можете получить значение объекта enum.map будет содержать значение для сопоставления объекта enum.Если значение типа null или empty 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());
3 голосов
/ 10 декабря 2011

Вы можете использовать значение по умолчанию, чтобы установить для столбца поле NULL enum в вашей сущности.

@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

Кстати, я бы назвал перечислимые поля НЕИЗВЕСТНЫМИ, потому что это может быть перепутано с NULL-значением БД.

...