【问题标题】:Hibernate, MySQL, Enum, and NULL休眠、MySQL、枚举和 NULL
【发布时间】:2012-01-17 07:04:38
【问题描述】:

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

枚举类:

private enum ObjType {
    itemA,
    itemB,
    NULL
}

它需要 NULL 作为成员,但这无济于事。我是 EE Java 的新手,如果有任何帮助,我将不胜感激。 谢谢

【问题讨论】:

    标签: java mysql hibernate enums null


    【解决方案1】:

    您可以将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 将包含值到枚举对象映射。如果 map 中不存在 nullempty space 之类的值,则 map 将返回 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());
    

    【讨论】:

    • 添加了代码.. 这是使用 emun 的正确而灵活的方式。
    【解决方案2】:

    您可以使用默认值将列设置为实体中的 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
    

    顺便说一句,我将枚举字段称为 UNKNOWN,因为它可能与 DB NULL 值混淆。

    【讨论】:

    • 它会起作用,但我正在寻找一种非侵入式的解决方案,用于我不想修改原始数据的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多