开发者

Is it possible to do type conversion (from boolean to yes_no) in pure JPA?

There is an annotation in Hibernate that can persist boolean types as 'Y'/'N' in the database.

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

However if I don't want to bind to Hibernate is there a way to do it in pure JPA without using getters/setters?


Pure JPA without Hibernate is achieved by using some kind of conversion

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

Nothing else


This is pure JPA without using getters/setters, so it answers the question:

@Entity
public class Person {    

    @Convert(converter=BooleanToStringConverter.class)
    private Boolean isAlive;    
    ...
}

And then:

@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);
        }
    }

Please note this solution is JPA 2.1, and was not available when the question was first asked: The JPA 2.1 specification was released 22 April 2013.


You can use like this

@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);
}

}


Similar to the above (@Arthur Ronald F D Garcia), but you can also use JPA field access and leave the ivar in the type of the database with transient accessors - marking them @Transient. This ensures JPA acces the entity by field access but leaves the accessors available for appropriately typed usage.

Using the above example:

@Column(name="isconstrained")
private int isConstrained;

@Transient
public boolean getIsConstrained() {
    return (isConstrained == 1);
}

@Transient
public void setIsConstrained(boolean isConstrained) {
    this.isConstrained = (isConstrained? 1 : 0);
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜