Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中映射一组枚举类型?_Java_Hibernate_Orm_Nhibernate Mapping - Fatal编程技术网

Java 如何在Hibernate中映射一组枚举类型?

Java 如何在Hibernate中映射一组枚举类型?,java,hibernate,orm,nhibernate-mapping,Java,Hibernate,Orm,Nhibernate Mapping,在hibernate中,是否可以定义类到一组枚举的映射 我已经能够找到如何定义集合映射的示例,并且能够找到如何映射枚举的单独示例,但是我无法确定如何为类定义枚举的集合 谁能给我举个例子吗 这是在现有应用程序的基础上构建的,因此我无法更改数据库模式 这就是我希望建立的关系。Wicket是一个普通类,WicketType是一个Java枚举 +----------------+ +------------+ +------------+ | Wicket | | Re

在hibernate中,是否可以定义类到一组枚举的映射

我已经能够找到如何定义集合映射的示例,并且能够找到如何映射枚举的单独示例,但是我无法确定如何为类定义枚举的集合

谁能给我举个例子吗

这是在现有应用程序的基础上构建的,因此我无法更改数据库模式

这就是我希望建立的关系。Wicket是一个普通类,WicketType是一个Java枚举

+----------------+    +------------+    +------------+
| Wicket         |    | Ref Table  |    | WicketType |
+----------------+    +------------+    +------------+
| INT     | W_ID |    |            |    | W_TypeId   |
| ....    |      | FK | W_ID       | FK | WicketType |
| INT     | TYPE |----| W_TypeId   |----|            |
+----------------+    +------------+    +------------+
再次感谢

不满足您的需要吗

为了详细说明轻率的初始响应,引用提供了一种使用枚举序号映射枚举的方法

在这种情况下,它实际上比看起来更简单,因为您在一个集合中托管枚举,您需要为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;
    }
}
封装测试;
公共类WicketTypeState扩展了IntEnumUserType{
私有WicketType WicketType;
公共WicketTypeState(){
//我们必须将枚举的值提供给父级。
super(WicketType.class,WicketType.values());
}
公共WicketType getWicketType(){
返回wicketType;
}
公共无效设置WicketType(最终WicketType WicketType){
this.wicketType=wicketType;
}
}
定义枚举表的映射:

<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>


这在my box(tm)上起到了作用,如果您需要更多信息,请告诉我。

下面的示例代码显示了如何通过注释实现您的目标

@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;
    }
    ...
    ...
}
更简单的方法是

<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>

边门
12

你能提供一个例子吗?不——它有一种映射枚举的方法,但没有指定如何在映射集中使用该枚举。根据我的评论,你能提供一个例子吗?一旦定义了如何使用序号映射枚举,您不需要在集合映射中添加IntEnumUserType作为类吗?谢谢您的帮助。我提供了一个更清晰的例子来说明我正在尝试做什么。我将尝试将EnumUserType指定为映射中的类。如果指定enum表的映射(上面的第二段代码)——名为“state”的属性链接到哪里?如果它是一对多但与Ref表相对,只需更改WicketType.hbm.xml中的表声明以指向Ref表并添加另一个,WicketType表的标准一对一关系。使用Hibernate 4Thanks使用
@ElementCollection
而不是
@collectionFelements
,就这么简单
<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>