Hibernate中有一个注释可以在数据库中将布尔类型保持为'Y'/'N'。
但是,如果我不想绑定到Hibernate,有没有办法在纯JPA中使用它而不使用getter / setter?
答案 0 :(得分:8)
没有Hibernate的纯JPA是通过使用某种转换来实现的
private boolean enabled;
@Transient
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@Column(name="ENABLED")
public String getEnabledAsString(){
return enabled ? "Y" : "N";
}
public void setEnabledAsString(String enabled){
this.enabled = "Y".equalsIgnoreCase(enabled);
}
没有别的
答案 1 :(得分:6)
这是纯粹的JPA而不使用getter / setter,所以它回答了这个问题:
@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) ? "N" : "Y";
}
@Override
public Boolean convertToEntityAttribute(String value) {
return "Y".equals(value);
}
}
请注意此解决方案是JPA 2.1,在首次提出问题时无法使用:JPA 2.1规范于2013年4月22日发布。
答案 2 :(得分:2)
你可以这样使用
@Entity
public class Employee {
@Convert(converter=BooleanTFConverter.class)
private Boolean isActive;
}
@Converter
public class BooleanYNConverter implements AttributeConverter<Boolean, String>{
@Override
public String convertToDatabaseColumn(Boolean value) {
if (value) {
return "Y";
} else {
return "N";
}
}
@Override
public Boolean convertToEntityAttribute(String value) {
return "Y".equals(value);
}
}
答案 3 :(得分:1)
与上述类似(@Arthur Ronald F D Garcia),但您也可以使用JPA字段访问,并将ivar保留在具有瞬态访问器的数据库类型中 - 将它们标记为@Transient
。这可以确保JPA通过字段访问来访问实体,但保留了访问器以进行适当的类型化使用。
使用上面的例子:
@Column(name="isconstrained")
private int isConstrained;
@Transient
public boolean getIsConstrained() {
return (isConstrained == 1);
}
@Transient
public void setIsConstrained(boolean isConstrained) {
this.isConstrained = (isConstrained? 1 : 0);
}