2010-08-03 15 views
5

Mam istniejącą bazę danych, z którą teraz łączę się przy użyciu hibernacji. Nie mogę zmienić danych w tym momencie i mieć wszystko działa niezależnie od pojedynczej kolumny.Mapowanie wyliczenia hibernacji przy użyciu annotaions

Mam kolumnę stanu, który ma wartości:

  • nowy
  • pośrednictwem poczty
  • w
  • z

a kolumna jest odwzorowywany w następujący sposób:

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

NAPRAWDĘ chciałbym (z powodów związanych z aplikacją), aby ta kolumna została zmapowana jako Java Enum (TeamMemberStatus), , ale ze względu na fakt, że "nowe" jest słowem kluczowym w języku Java, nie mogę tego mieć jako członka wyliczającego.

Jeśli mam kontury kontinuum NOWA, MAILED, IN i OUT hibernacja kończy się niepowodzeniem, ponieważ w EnumType robi Enum.valueOf().

Czy istnieje sposób, aby zmapować to do mojego Enum bez konieczności pisania złożonego UserType?

- dodaje zawartość

My Enum tak:

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

jest poprawnym enum Java, ale nie pasujące przypadek w bazie danych. Jeśli zmienię go tak, aby pasował do bazy danych, takiej jak:

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

Nie zostanie skompilowany, ponieważ "nowy" jest słowem zastrzeżonym w Javie.

Odpowiedz

2

Jeśli można użyć instrukcji SQL GÓRNA w bazie danych, będzie ona działać bez użycia UserType

UPDATE

dobrze, to może nie być najładniejsza rozwiązaniem, ale to rozwiązuje, co chcesz

@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

Zakładam, że chcesz zmienić dane w bazie danych? Coś jak aktualizacja statusu TABLE status = upper (status). Nie mogę tego zrobić, ponieważ spowoduje to zerwanie istniejących aplikacji, które rozmawiają z tymi danymi, oczekując, że będzie to mała wartość. – stevemac

+0

@stevemac Zaktualizowany –

+0

To jest to, co opracowałem na końcu, w zasadzie wewnętrznie przechowaj ciąg i zmapuj go z/do wyliczenia po wywołaniu get/set. Będzie musiał zrobić to krótko, dopóki nie będę mógł zaktualizować wszystkich aplikacji, aby używać stałych wielkich liter. – stevemac

1

Jeśli wartości w bazie danych to "nowe", "wysłane", "w" i "na zewnątrz", wówczas Twój wymóg musi mieć dokładnie takie same nazwy. - Wydaje mi się, że problem polega na tym, że Wasze Enumy są wielkimi literami, ale wasze bazy danych nie.

+1

to jest właśnie problem, ale nie mogę mieć ae num o wartości new pisanej małymi literami, ponieważ jest to słowo zarezerwowane w java. – stevemac

Powiązane problemy