是否可以在纯JPA中进行类型转换(从布尔值到yes_no)?

时间:2010-11-12 01:00:06

标签: hibernate jpa types annotations boolean

Hibernate中有一个注释可以在数据库中将布尔类型保持为'Y'/'N'。

https://stackoverflow.com/questions/1154833/configure-hibernate-using-jpa-to-store-y-n-for-type-boole an-instead-of-0-1

但是,如果我不想绑定到Hibernate,有没有办法在纯JPA中使用它而不使用getter / setter?

4 个答案:

答案 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);
}