2010-08-03 14 views
5

Tengo una base de datos existente a la que ahora me estoy conectando usando hibernate. No puedo cambiar los datos en él en este momento y tengo todo funcionando aparte de una sola columna.Hibernate Enum mapping utilizando anotaciones

que tienen una columna de estado que tiene los valores:

  • nueva
  • enviado por correo
  • en
  • cabo

y la columna se asigna de la siguiente manera:

@Column(name = "STATUS", nullable = false, length = 50) 
@Enumerated(EnumType.STRING) 
private TeamMemberStatus status; 

REALMENTE me gustaría (por razones de aplicación) tener esta columna asignada como Java Enum (TeamMemberStatus), pero debido al hecho de que 'nueva' es una palabra clave en Java no puedo tener eso como un miembro enum.

Si tengo la enumeración de contstants NEW, MAILED, IN y OUT hibernate falla porque dentro de EnumType hace un Enum.valueOf().

¿Hay alguna forma de mapear esto en mi Enum sin tener que escribir un tipo de usuario complejo?

- el contenido agregado

Mi Enum como esto:

public enum TeamMemberStatus { 
    NEW, MAILED, IN, OUT 
} 

es una enumeración de Java válido, pero que no coincida con el caso de la base de datos. Si cambio para que coincida con la base de datos como:

public enum TeamMemberStatus { 
    new, mailed, in, out 
} 

No se compilará como 'nuevo' es una palabra reservada de Java.

Respuesta

2

Si puede utilizar una instrucción SQL SUPERIOR en la base de datos, funcionará sin utilizar ningún UserType

ACTUALIZACIÓN

bien, puede no ser la solución más bonito pero resuelve lo que quiere

@Entity 
public class WrapperEntity { 

    private TeamMemberStatus memberStatus; 

    @Transient 
    private TeamMemberStatus getMemberStatus() { 
     return this.memberStatus; 
    } 

    public void setMemberStatus(TeamMemberStatus memberStatus) { 
     this.memberStatus = memberStatus; 
    } 

    @Column(name="STATUS", nullable=false, length=50) 
    public String getMemberStatusAsString() { 
     return memberStatus.name().toLowerCase(); 
    } 

    public void setMemberStatusAsString(String memberStatus) { 
     this.setsetMemberStatus(TeamMemberStatus.valueOf(memberStatus.toUpperCase())); 
    } 

}

+0

Supongo que quiere cambiar los datos en la base de datos. Algo así como actualizar TABLE establecer estado = superior (estado). No puedo hacer eso ya que romperá las aplicaciones existentes que hablan con esos datos esperándolo como un valor en minúsculas. – stevemac

+0

@stevemac Updated –

+0

Eso es lo que resolví al final, basicamente almacenamos la cadena internamente y la asignamos desde/a la enumeración cuando se llama a los get/set. Tendrá que hacer en el corto plazo, hasta que pueda obtener todas las aplicaciones actualizadas para usar constantes en mayúsculas. – stevemac

1

Si los valores de su base de datos son "nuevo", "enviado por correo", "dentro" y "fuera", entonces su Enum necesita exactamente los mismos nombres. - Creo que el problema es que sus Enumeraciones están en mayúsculas, pero los valores de su base de datos no.

+1

Eso es exactamente el problema, pero no puedo tener ae num con el valor nuevo en minúsculas ya que es una palabra reservada en java. – stevemac

Cuestiones relacionadas