Можно ли сделать преобразование типа (от логического до yes_no) в чистом JPA? - PullRequest
7 голосов
/ 12 ноября 2010

В Hibernate есть аннотация, которая может сохранять логические типы как «Y» / «N» в базе данных.

/1325712/nastroite-rezhim-gibernatsii-s-ispolzovaniem-jpa-dlya-hraneniya-y-n-dlya-tipa-boolean-vmesto-0-1 ан-вместо-оф-0-1

Однако если я не хочу связываться с Hibernate, есть ли способ сделать это в чистом JPA без использования методов получения / установки?

Ответы [ 4 ]

8 голосов
/ 12 ноября 2010

Чистый JPA без Hibernate достигается с помощью какого-либо преобразования

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

Ничего другого

6 голосов
/ 13 марта 2014

Это чистый JPA без использования методов получения / установки, поэтому он отвечает на вопрос:

@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 была выпущена 22 апреля 2013 г.

2 голосов
/ 30 августа 2014

Вы можете использовать вот так

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

}

1 голос
/ 16 января 2013

Аналогично вышеописанному (@Arthur Ronald FD Garcia), но вы также можете использовать доступ к полям JPA и оставить ивар в типе базы данных с временными средствами доступа - отметив их @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);
}
...