Это чистый JPA без использования методов получения / установки. По состоянию на 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
в базе данных должно быть null
в Java.
Но если вы вернете null
в Java, вы получите NullPointerException
, если ваше поле будет примитивным логическим . Другими словами, если только некоторые из ваших полей на самом деле не используют класс Boolean , лучше всего рассматривать 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);
}
И еще один вариант, если вы хотите разрешить null
в Java, но не в базе данных:
@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);
}