2011-01-14 6 views
6

Mam encję zawierającą właściwość enum. Że nieruchomość może być jednym z moich typów wyliczenia w moim kodzie:Utrzymuj nieprzetworzoną Java Enum przy użyciu Hibernate

public enum AutomobileType { 
    CAR, TRUCK, MOTORCYCLE 
} 

public enum BoatType { 
    ROW_BOAT,YACHT,SHIP 
} 

@Entity 
public class FooBar { 

    @Enumerated(value=EnumType.ORDINAL) 
    private Enum enumValue; 

    public void setEnumValue(Enum value) { ... } 
    public Enum getEnumValue() { ... } 
} 

ta zawodzi z wyjątkiem „niewłaściwy typ danych: Dla ciągu wejściowego:« [B @ f0569a»Zmieniłem foobar do zapamiętywania Właściwość jako Integer, która działa, ale to nie jest to, czego potrzebuję Potrzebuję rzeczywistego wyliczenia Wszelkie sugestie, jak to zrobić, aby Enum można było zachować jako int, ale później wyciągnął do prawidłowego typu Enum

+0

"Jakieś sugestie, jak to zrobić, aby Enum mógł zostać zachowany jako int, ale później wyciągnięty do prawidłowego typu Enum?" - Masz na myśli, że chcesz zapisać "1", a następnie odzyskać go jako AutomobileType? – jpkrohling

Odpowiedz

3

Musisz zdefiniować custom UserType dla Enum.

+0

To nie dotyczy JPA, z pewnością tylko dla konfiguracji hibernacji XML. – skaffman

+0

Wydaje mi się, że jest to jedyny sposób na wyliczenia polimorficzne, chociaż przywoływana próbka kodu powinna zostać odpowiednio zmodyfikowana. – axtavt

+0

To trochę niedorzeczne, że JPA nie ma standardu wykonywania niestandardowych powiązań kolumn/właściwości. Musisz zrobić to ręcznie w encji, mając dwa zestawy właściwości i oznaczając jeden zestaw jako przejściowy. –

2

Zasadniczo nie powinieneś tego robić. Jeśli dwa (lub więcej wyliczeń) można przypisać t o to samo pole, a następnie połącz je w jedno pole.

Jeśli używasz dziedziczenie, jak: Vehicle dwie podklasy - Boat i Car, można mieć różne pola w każdej podklasy - przecież każdy z tych teksty stałe dotyczy tylko konkretnego typu. A więc:

@Column 
private BoatType boatType; 
+0

To jest właściwy sposób, aby to zrobić. :) –

+0

@Bozho: Chce przechowywać różne wyliczenia w tej samej nieruchomości. – axtavt

+0

Myślę, że OP oznacza, że ​​faktycznie chce użyć polimorficznego 'Enum', zamiast konkretnego typu wyliczeniowego. – skaffman

0

Nie sądzę, że może to łatwo zadziałać z wieloma typami Enum, które próbują współistnieć w tej samej nieruchomości. W jaki sposób hibernacja wie, która klasa Enum powinna być tworzona, gdy ładuje pole z bazy danych?

Jeśli naprawdę chcesz to zrobić, musisz zakodować klasę enum + wartość za każdym razem, gdy utrwalisz tę właściwość (użyj niestandardowego UserType, jak sugeruje duffymo).

Nie możesz podzielić tego na dwie oferty, po jednej na klasę wyliczeń? Następnie możesz zadeklarować wartość enumValue (i enumValue2) jako właściwą klasę, która będzie działać po wyjęciu z pudełka.