3 回答
TA贡献1777条经验 获得超10个赞
我弄清楚如何执行此操作的唯一方法是为类提供两个属性。一个作为编程API的布尔值,不包含在映射中。它的getter和setter引用一个私有字符变量Y / N。然后,我有另一个受保护的属性,它包含在休眠映射中,它的getter和setter直接引用私有char变量。
编辑:正如已经指出的那样,还有直接内置于Hibernate中的其他解决方案。我留下这个答案,是因为它可以在您处理的旧字段无法与内置选项配合使用的情况下使用。最重要的是,这种方法不会造成严重的负面影响。
TA贡献1805条经验 获得超9个赞
Hibernate具有内置的“ yes_no”类型,可以执行您想要的操作。它映射到数据库中的CHAR(1)列。
基本映射: <property name="some_flag" type="yes_no"/>
注释映射(Hibernate扩展):
@Type(type="yes_no")
public boolean getFlag();
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);
}
添加回答
举报