3 回答

TA貢獻1777條經(jīng)驗 獲得超10個贊
我弄清楚如何執(zhí)行此操作的唯一方法是為類提供兩個屬性。一個作為編程API的布爾值,不包含在映射中。它的getter和setter引用一個私有字符變量Y / N。然后,我有另一個受保護的屬性,它包含在休眠映射中,它的getter和setter直接引用私有char變量。
編輯:正如已經(jīng)指出的那樣,還有直接內置于Hibernate中的其他解決方案。我留下這個答案,是因為它可以在您處理的舊字段無法與內置選項配合使用的情況下使用。最重要的是,這種方法不會造成嚴重的負面影響。

TA貢獻1805條經(jīng)驗 獲得超9個贊
Hibernate具有內置的“ yes_no”類型,可以執(zhí)行您想要的操作。它映射到數(shù)據(jù)庫中的CHAR(1)列。
基本映射: <property name="some_flag" type="yes_no"/>
注釋映射(Hibernate擴展):
@Type(type="yes_no")
public boolean getFlag();

TA貢獻1807條經(jīng)驗 獲得超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);
}
}
編輯:
上面的實現(xiàn)考慮了與字符“ Y”不同的任何內容,包括null,如false。那是對的嗎?這里有些人認為這是不正確的,并認為null數(shù)據(jù)庫中應該使用nullJava。
但是,如果您返回nullJava,則NullPointerException如果您的字段是原始布爾值,它將給您一個提示。換句話說,除非你的一些領域的實際使用類布爾也最好考慮null為false,并使用上述實現(xiàn)。這樣,無論數(shù)據(jù)庫內容如何,Hibernate都不會發(fā)出任何異常。
如果您確實想接受null并發(fā)出異常(如果數(shù)據(jù)庫的內容不完全正確),那么我猜您不應該接受除“ Y”,“ N”和“ ?!敝獾娜魏巫址鹡ull。使其保持一致,并且不接受“ y”,“ n”,“ 0”和“ 1”之類的任何變體,只會使您以后的生活更加艱難。這是一個更嚴格的實現(xiàn):
@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而不允許使用數(shù)據(jù)庫:
@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);
}
添加回答
舉報