为了账号安全,请及时绑定邮箱和手机立即绑定

配置休眠(使用JPA)以将Y / N存储为布尔类型(而不是0/1)

配置休眠(使用JPA)以将Y / N存储为布尔类型(而不是0/1)

胡子哥哥 2019-12-20 10:10:11
我可以设置JPA /休眠将Boolean类型持久化为Y/N吗?在数据库中(该列定义为varchar2(1)。当前将其存储为0/1。数据库为Oracle。
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

我弄清楚如何执行此操作的唯一方法是为类提供两个属性。一个作为编程API的布尔值,不包含在映射中。它的getter和setter引用一个私有字符变量Y / N。然后,我有另一个受保护的属性,它包含在休眠映射中,它的getter和setter直接引用私有char变量。

编辑:正如已经指出的那样,还有直接内置于Hibernate中的其他解决方案。我留下这个答案,是因为它可以在您处理的旧字段无法与内置选项配合使用的情况下使用。最重要的是,这种方法不会造成严重的负面影响。


查看完整回答
反对 回复 2019-12-20
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

Hibernate具有内置的“ yes_no”类型,可以执行您想要的操作。它映射到数据库中的CHAR(1)列。


基本映射: <property name="some_flag" type="yes_no"/>


注释映射(Hibernate扩展):


@Type(type="yes_no")

public boolean getFlag();


查看完整回答
反对 回复 2019-12-20
?
函数式编程

TA贡献1807条经验 获得超9个赞

这是纯JPA,不使用getter / setter。截至2013/2014,这是不使用任何Hibernate特定注释的最佳答案,但是请注意,此解决方案是JPA 2.1,当首次提出问题时不可用:


@Entity

public class Person {    


    @Convert(converter=BooleanToStringConverter.class)

    private Boolean isAlive;    

    ...

}

然后:


@Converter

public class BooleanToStringConverter implements AttributeConverter<Boolean, String> {


    @Override

    public String convertToDatabaseColumn(Boolean value) {        

        return (value != null && value) ? "Y" : "N";            

        }    


    @Override

    public Boolean convertToEntityAttribute(String value) {

        return "Y".equals(value);

        }

    }

编辑:


上面的实现考虑了与字符“ Y”不同的任何内容,包括null,如false。那是对的吗?这里有些人认为这是不正确的,并认为null数据库中应该使用nullJava。


但是,如果您返回nullJava,则NullPointerException如果您的字段是原始布尔值,它将给您一个提示。换句话说,除非你的一些领域的实际使用类布尔也最好考虑null为false,并使用上述实现。这样,无论数据库内容如何,Hibernate都不会发出任何异常。


如果您确实想接受null并发出异常(如果数据库的内容不完全正确),那么我猜您不应该接受除“ Y”,“ N”和“ 。”之外的任何字符null。使其保持一致,并且不接受“ y”,“ n”,“ 0”和“ 1”之类的任何变体,只会使您以后的生活更加艰难。这是一个更严格的实现:


@Override

public String convertToDatabaseColumn(Boolean value) {

    if (value == null) return null;

    else return value ? "Y" : "N";

    }


@Override

public Boolean convertToEntityAttribute(String value) {

    if (value == null) return null;

    else if (value.equals("Y")) return true;

    else if (value.equals("N")) return false;

    else throw new IllegalStateException("Invalid boolean character: " + value);

    }

还有另一种选择,如果要允许使用nullJava而不允许使用数据库:


@Override

public String convertToDatabaseColumn(Boolean value) {

    if (value == null) return "-";

    else return value ? "Y" : "N";

    }


@Override

public Boolean convertToEntityAttribute(String value) {

    if (value.equals("-") return null;

    else if (value.equals("Y")) return true;

    else if (value.equals("N")) return false;

    else throw new IllegalStateException("Invalid boolean character: " + value);

    }


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 809 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信