2010-08-03 15 views
5

Ho un database esistente che ora sto collegando all'utilizzo di hibernate. Al momento non posso modificare i dati al suo interno e fare in modo che tutto funzioni separatamente da una singola colonna.Hibernate Enum mapping usando annotaions

Ho una colonna di stato che ha i valori:

  • nuovo
  • spedita
  • in
  • fuori

e la colonna è mappata come segue:

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

Mi piacerebbe davvero (per motivi di applicazione) di avere questa colonna mappata come un Enum Java (TeamMemberStatus), ma a causa del fatto che il 'nuovo' è una parola chiave in Java non posso avere che come membro enum.

Se ho i conflitti di enumerazione NEW, MAILED, IN e OUT, l'ibernazione non riesce poiché EnumType esegue Enum.valueOf().

C'è un modo per me di mappare questo al mio Enum senza dover scrivere un UserType complesso?

- contenuto aggiunto

mio Enum in questo modo:

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

è un enum Java valida, ma che non corrisponde il caso del database. Se cambio in modo che corrisponda al database come:

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

Non verrà compilato come 'nuovo' è una parola riservata Java.

risposta

2

Se è possibile utilizzare un'istruzione SQL SUPERIORE alla banca dati, funzionerà senza utilizzare alcun UserType

UPDATE

bene, può non essere la soluzione più bella ma risolve quello che vuoi

@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

Suppongo che vogliate cambiare i dati nel database? Qualcosa come aggiornamento TABLE set status = upper (status). Non riesco a farlo poiché interromperà le applicazioni esistenti che parlano di quei dati che si aspettano come un valore in minuscolo. – stevemac

+0

@stevemac aggiornato –

+0

Questo è ciò che ho risolto alla fine, memorizzando la stringa internamente e mappandola da/a enum quando vengono chiamati i get/set. Dovrà fare a breve termine, fino a quando non riesco a ottenere tutte le app aggiornate per utilizzare le costanti in maiuscolo. – stevemac

1

Se i valori del database sono "nuovo", "inviato", "in" e "out", l'Enum ha esattamente gli stessi nomi. - Credo che il problema sia che i tuoi Enum sono in maiuscolo ma i tuoi valori di base dati no.

+1

Questo è esattamente il problema, ma non posso avere ae num con il valore new in minuscolo in quanto è una parola riservata in java. – stevemac

Problemi correlati