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

我可以设置JPA /休眠将Boolean类型持久化为Y/N吗?在数据库中(该列定义为varchar2(1)。当前将其存储为0/1。数据库为Oracle。



胡子哥哥
浏览 810回答 3
3回答

不负相思意

我弄清楚如何执行此操作的唯一方法是为类提供两个属性。一个作为编程API的布尔值,不包含在映射中。它的getter和setter引用一个私有字符变量Y / N。然后,我有另一个受保护的属性,它包含在休眠映射中,它的getter和setter直接引用私有char变量。编辑:正如已经指出的那样,还有直接内置于Hibernate中的其他解决方案。我留下这个答案,是因为它可以在您处理的旧字段无法与内置选项配合使用的情况下使用。最重要的是,这种方法不会造成严重的负面影响。

Cats萌萌

Hibernate具有内置的“ yes_no”类型,可以执行您想要的操作。它映射到数据库中的CHAR(1)列。基本映射: <property name="some_flag" type="yes_no"/>注释映射(Hibernate扩展):@Type(type="yes_no")public boolean getFlag();

函数式编程

这是纯JPA,不使用getter / setter。截至2013/2014,这是不使用任何Hibernate特定注释的最佳答案,但是请注意,此解决方案是JPA 2.1,当首次提出问题时不可用:@Entitypublic class Person {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; @Convert(converter=BooleanToStringConverter.class)&nbsp; &nbsp; private Boolean isAlive;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; ...}然后:@Converterpublic class BooleanToStringConverter implements AttributeConverter<Boolean, String> {&nbsp; &nbsp; @Override&nbsp; &nbsp; public String convertToDatabaseColumn(Boolean value) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return (value != null && value) ? "Y" : "N";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; @Override&nbsp; &nbsp; public Boolean convertToEntityAttribute(String value) {&nbsp; &nbsp; &nbsp; &nbsp; return "Y".equals(value);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }编辑:上面的实现考虑了与字符“ Y”不同的任何内容,包括null,如false。那是对的吗?这里有些人认为这是不正确的,并认为null数据库中应该使用nullJava。但是,如果您返回nullJava,则NullPointerException如果您的字段是原始布尔值,它将给您一个提示。换句话说,除非你的一些领域的实际使用类布尔也最好考虑null为false,并使用上述实现。这样,无论数据库内容如何,Hibernate都不会发出任何异常。如果您确实想接受null并发出异常(如果数据库的内容不完全正确),那么我猜您不应该接受除“ Y”,“ N”和“ 。”之外的任何字符null。使其保持一致,并且不接受“ y”,“ n”,“ 0”和“ 1”之类的任何变体,只会使您以后的生活更加艰难。这是一个更严格的实现:@Overridepublic String convertToDatabaseColumn(Boolean value) {&nbsp; &nbsp; if (value == null) return null;&nbsp; &nbsp; else return value ? "Y" : "N";&nbsp; &nbsp; }@Overridepublic Boolean convertToEntityAttribute(String value) {&nbsp; &nbsp; if (value == null) return null;&nbsp; &nbsp; else if (value.equals("Y")) return true;&nbsp; &nbsp; else if (value.equals("N")) return false;&nbsp; &nbsp; else throw new IllegalStateException("Invalid boolean character: " + value);&nbsp; &nbsp; }还有另一种选择,如果要允许使用nullJava而不允许使用数据库:@Overridepublic String convertToDatabaseColumn(Boolean value) {&nbsp; &nbsp; if (value == null) return "-";&nbsp; &nbsp; else return value ? "Y" : "N";&nbsp; &nbsp; }@Overridepublic Boolean convertToEntityAttribute(String value) {&nbsp; &nbsp; if (value.equals("-") return null;&nbsp; &nbsp; else if (value.equals("Y")) return true;&nbsp; &nbsp; else if (value.equals("N")) return false;&nbsp; &nbsp; else throw new IllegalStateException("Invalid boolean character: " + value);&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java