2010-11-12 9 views

Respuesta

8

puro APP sin Hibernate se logra mediante el uso de algún tipo de conversión

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

Nada más

+0

Sí, esto va a funcionar (1). Me pondré en contacto con usted por correo este fin de semana acerca de un comentario pendiente que no respondí. Estoy muy interesado por la idea, así que vamos a discutir :) –

+0

Así que este es el método getter/setter. Ojalá haya otras formas más fáciles de solucionar esto. ¿Por qué el estándar JPA no proporciona soporte de anotaciones para esto? – newguy

+0

Esto tampoco trata con la situación de que si la columna tiene valor NULL en la base de datos. Puede modificar para obtener el valor NULO pero cuando lo ingresa se convierte a "N". – newguy

1

Similar al anterior (@Arthur Ronald García FD) pero también se puede utilizar JPA acceso en campo y deje el ivar en el tipo de la base de datos con accesadores transitorios, marcándolos @Transient. Esto garantiza que JPA acceda a la entidad mediante el acceso de campo, pero deja los accesos disponibles para un uso apropiadamente tipado.

Utilizando el ejemplo anterior:

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

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

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

El único inconveniente de esto es que es posible que no pueda mantener las clases de JPA generadas, ya que ha diseñado sus accesos. Si esto es importante, es posible que necesite construir una fábrica de generadores para sus clases de JPA. ¿No estoy seguro si esto se puede hacer con Eclipse Jetty? – wmorrison365

5

Ésta es la APP pura sin usar getters/setters, por lo que responde a la pregunta:

@Entity 
public class Person {  

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

Y luego:

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

favor tenga en cuenta que esta solución es JPA 2.1, y no estaba disponible cuando se hizo la pregunta por primera vez: el JPA 2.1 specificat ión fue lanzado el 22 de abril de 2013.

2

Se puede utilizar como esto

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

}

Cuestiones relacionadas