Сохранять сырой Java Enum, используя Hibernate - PullRequest
6 голосов
/ 14 января 2011

У меня есть объект, содержащий свойство enum.Это свойство может быть любым из моих типов Enums в моей кодовой базе:

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() { ... }
}

Это происходит с ошибкой, за исключением "Неверный тип данных: для входной строки:" [B @ f0569a ". Я изменил FooBar насохранить свойство как целое число, которое работает, но это не то, что мне нужно. Мне нужен фактический enum. Любые предложения о том, как сделать эту работу так, чтобы Enum мог быть сохранен как int, но позже извлечен в правильный тип Enum?

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Вам необходимо определить пользовательский тип пользователя для Enum.

2 голосов
/ 14 января 2011

Как правило, вы не должны этого делать.Если два (или более перечисления) могут быть назначены одному и тому же полю, объедините их в один.

Если вы используете наследование, например: Vehicle с двумя подклассами - Boat и Car, тогда вы можете иметь разные поля в каждом подклассе - ведь каждое из этих перечислений относится только к определенному типу.Итак:

@Column
private BoatType boatType;
0 голосов
/ 14 января 2011

Я не думаю, что это может легко работать с несколькими типами Enum, пытающимися сосуществовать в одном свойстве. Как hibernate узнает, какой класс Enum должен быть создан при загрузке поля из БД?

Если вы действительно хотите сделать это, вам нужно каким-то образом кодировать класс enum + значение каждый раз, когда вы сохраняете это свойство (используйте пользовательский тип пользователя, как рекомендует duffymo).

Разве вы не можете разбить это на два свойства, по одному на перечисление класса? Затем вы можете объявить enumValue (и enumValue2) как правильный класс, и он будет работать из коробки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...