Hibernate - как сопоставить EnumSet
У меня есть цветовое перечисление
public enum color { GREEN, WHITE, RED }
и у меня есть MyEntity, который содержит его.
public class MyEntity {
private Set<Color> colors;
...
у меня уже есть тип пользователя для сопоставления моих перечислений.
Вы знаете, как сопоставить набор перечислений в Hibernate hbm.в XML?
Мне нужен UserType или есть самый простой способ?
спасибо
edit: просто чтобы отметить, я ищу hbm.в XML конфигурация не аннотация @CollectionOfElements
2 ответов
я использую решение из отображение EnumSet поток, который полагается на использование <element column>
. Вам просто нужна таблица с идентификатором и строкой для сопоставления коллекции (MYENTITY_COLOR
здесь). И отображение выглядит так (EnumUserType
С Java 5 EnumUserType):
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<typedef name="color" class="com.stackoverflow.q2402869.EnumUserType">
<param name="enumClassName">com.stackoverflow.q2402869.Color</param>
</typedef>
<class name="com.stackoverflow.q2402869.MyEntity" entity-name="MyEntity" table="MYENTITY">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="assigned" />
</id>
<set name="colors" table="MYENTITY_COLORS">
<key column="ID" not-null="true"/>
<element type="color" column="COLOR"/>
</set>
</class>
</hibernate-mapping>
запрос может выглядеть так:
select distinct e from MyEntity e join e.colors colors where colors IN ('WHITE', 'GREEN')
все решение работает ну для нагрузок, сохраняет и запросы (кредиты jasonab).
кажется, вам нужно использовать аннотацию @CollectionOfElements. Док находится на http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection-extratype, глава ' 2.4.6.2.5. Коллекция элементов или составных элементов. В Примере также сопоставляется набор перечислений.