Вопрос по java, orm, hibernate, nhibernate-mapping – Как отобразить набор типов enum в Hibernate?

8

Можно ли в hibernate определить отображение для класса на набор перечислений?

Мне удалось найти примеры того, как определить отображения множеств, и я смог найти отдельные примеры для того, как отобразить Enums, но я не могу понять, как определить Enums для класса.

Может ли кто-нибудь дать мне пример?

Это строится поверх существующего приложения, поэтому я не могу изменить схему базы данных.

Это отношение, которое я хочу смоделировать. Wicket - это обычный класс, а WicketType - это Java Enum.

+----------------+    +------------+    +------------+
| Wicket         |    | Ref Table  |    | WicketType |
+----------------+    +------------+    +------------+
| INT     | W_ID |    |            |    | W_TypeId   |
| ....    |      | FK | W_ID       | FK | WicketType |
| INT     | TYPE |----| W_TypeId   |----|            |
+----------------+    +------------+    +------------+

еще раз спасибо

Не могли бы вы привести пример? Rich Seller

Ваш Ответ

3   ответа
4

<typedef name="WicketTypeType" class="org.hibernate.type.EnumType">
  <param name="enumClass">Wicket</param>
  <param name="type">12</param>
</typedef>

<class  name="Wicket"...

    <set name="WicketType" table="Ref Table">
        <key column="W_ID" />
        <element column="W_TypeID" type="WicketTypeType"/>
    </set>

...
</class>
Спасибо, было так просто
3

как вы можете достичь желаемого с помощью аннотаций.

@Entity
@Table (name = "wicket")
public class Wicket {

    ...
    ...

    private List<WicketType> wicketTypes = new ArrayList<WicketType>();

    @CollectionOfElements(fetch=FetchType.EAGER)
    @JoinTable(
            name="wicket_wicket_types", // ref table.
            joinColumns = {@JoinColumn(name="wicket_id")}
    )
    @Column(name="wicket_type_id")
    public List<WicketType> getWicketTypes() {
        return this.wicketTypes;
    }

    public void setWicketTypes(List<WicketType> wicketTypes) {
        this.wicketTypes = wicketTypes;
    }
    ...
    ...
}

WicketType стандартное перечисление Java 5, порядок и порядковые номера объявлений перечисления которого соответствуют порядку и столбцу (wicket_type_id) значения вwicket_type Таблица.

public enum WicketType {
   WICKET_TYPE1, WICKET_TYPE2 ...
}
использование@ElementCollection вместо@CollectionOfElements с Hibernate 4
2

этот не делать то, что вам нужно?

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

В этом случае это на самом деле проще, чем кажется, потому что вы размещаете перечисления в наборе, вам нужно предоставить аксессор для WicketType для подтипа IntEnumUserType, супертип позаботится о отображении порядкового номера к примеру.

package test;

public class WicketTypeState extends IntEnumUserType<WicketType> {
    private WicketType wicketType;

public WicketTypeState() {
    // we must give the values of the enum to the parent.
    super(WicketType.class, WicketType.values());
}

    public WicketType getWicketType() {
        return wicketType;
    }

    public void setWicketType(final WicketType wicketType) {
        this.wicketType = wicketType;
    }
}

Определите сопоставления для таблицы enum:

<hibernate-mapping package="test">  
  <class name="Wicket" table="Wicket">
    <id name="id" column="ID"/>
    <set name="wicketTypes" table="WicketType" inverse="true">
      <key column="ID"/>
      <one-to-many class="test.WicketTypeState"/>
    </set>
  </class>
</hibernate-mapping>

Затем для типа с набором перечислений определите отображение набора для этого свойства:

<hibernate-mapping package="test">
  <class name="WicketTypeState" lazy="true" table="WicketType">
    <id name="WicketType" 
      type="test.WicketTypeState"/>
  </class>
</hibernate-mapping>

Это сработало на моей коробке (тм), дайте мне знать, если вам нужна дополнительная информация.

Где вы указываете сопоставления для таблицы enum (второй блок кода выше) - где находится свойство с именем & quot; state & quot; ссылка на? Cuga
Нет, у него есть способ отобразить Enum, но не указано, как использовать этот Enum в сопоставленном наборе. Cuga
Если это один-ко-многим, но для таблицы Ref, просто измените объявление таблицы в WicketType.hbm.xml, чтобы оно указывало на таблицу Ref, и добавьте еще одно стандартное отношение один-к-одному в таблицу WicketType.
Спасибо за помощь. Я предоставил более четкий пример того, что я пытаюсь сделать. Я попытаюсь указать EnumUserType в качестве класса в наборе & lt; set & gt; отображение. Cuga
На мой комментарий, вы можете привести пример? Как только вы определили, как отображать перечисление с помощью порядкового номера, не нужно ли просто добавить IntEnumUserType в качестве класса в отображении набора?

Похожие вопросы