繁体   English   中英

Hibernate 3.3:如何按名称映射枚举列表

[英]Hibernate 3.3: how to map list of enums by name

我正在使用遗留代码且期限紧的项目。 该应用程序使用Hibernate 3.3.1.GA和XML配置。 可能可以升级到较新版本的Hibernate并集成JPA以启用AttributeConverter<Value, Representation>解决方案,我已经在其他问题(如问题)中看到过,但是我确实需要最短的抵抗之路。

我有一个实体,该实体将与Java代码中以枚举表示的值具有一对多关系。 我创建了一个表,该表应该捕获很多方面,如下所示:

CREATE TABLE theValueMapping (
    id int unsigned NOT NULL AUTO_INCREMENT,
    entity int unsigned NOT NULL,
    listIndex int unsigned NOT NULL,
    value VARCHAR(4) NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT FK_theValueMapping_entity FOREIGN KEY (entity) REFERENCES entityTable (id),
    UNIQUE UNIQUE_theValueMapping_entity_listIndex_pair (entity, listIndex),
    UNIQUE UNIQUE_theValueMapping_entity_value_pair (entity, value)
);

自然,我的实体有一个字段,用于存储枚举实例的列表:

package com.example;
public class TheEntity {
    private List<TheValue> theValues;
    // everything else dropped, but there are getters and setters
}

并假设枚举很简单:

package com.example;
public enum TheValue {
    A,
    B,
    C;
}

我需要获取此映射才能通过XML Hibernate配置工作。 我能设计的最好的方法可以启动应用程序,但无法加载任何记录:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.TheEntity" table="entityTable" lazy="false">
        <list name="theValues" table="theValueMapping">
            <key column="entity" />
            <list-index column="listIndex" />
            <element
                column="value"
                length="4"
                type="com.example.TheValue"
                not-null="true"
            />
        </list>
    </class>
</hibernate-mapping>

我该如何配置它,以便Hibernate将这些枚举值的列表从数据库加载到我的实体中?

答案是我先前拒绝的typedef方法加上缺少的依赖项的结合。

我没有意识到org.hibernate.type.EnumType是在Hibernate Annotations JAR中定义的,所以我添加了

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-annotations</artifactId>
    <version>${hibernate.version}</version>
</dependency>

到我的POM。

然后,我重新设计了Hibernate配置,以使用typedef通过这种类型映射我的枚举:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <typedef name="TheValue" class="org.hibernate.type.EnumType">
        <param name="enumClass">com.example.TheValue</param>
        <param name="type">12</param>
    </typedef>
    <class name="com.example.TheEntity" table="entityTable" lazy="false">
        <list name="theValues" table="theValueMapping">
            <key column="entity" />
            <list-index column="listIndex" />
            <element
                column="value"
                length="4"
                type="TheValue"
                not-null="true"
            />
        </list>
    </class>
</hibernate-mapping>

我感谢Hibernate论坛中的grimarr表示我需要hibernate-annotations.jar并感谢SO的Mike表示了typedef方法应该可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM