【问题标题】:Hibernate 3.3: how to map list of enums by nameHibernate 3.3:如何按名称映射枚举列表
【发布时间】:2018-06-13 11:26:52
【问题描述】:

我正在处理一个包含遗留代码且截止日期紧迫的项目。此应用程序使用 Hibernate 3.3.1.GA 和 XML 配置。可以升级到更新版本的 Hibernate 并集成 JPA 以启用我在其他问题(如this one)中看到的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 将这些枚举值的列表从数据库加载到我的实体中?

【问题讨论】:

    标签: java xml hibernate enums


    【解决方案1】:

    结果证明是我之前拒绝的 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>
    

    感谢grimarr from the Hibernate forums 表明我需要hibernate-annotations.jar 并感谢Mike from SO 表明typedef 方法应该有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      相关资源
      最近更新 更多