我正在开发一个包含遗留代码和紧迫期限的项目。此应用程序使用Hibernate 3.3.1.GA和XML配置。可能升级到更新版本的Hibernate并集成JPA以启用我在其他问题中看到的AttributeConverter<Value, Representation>
解决方案(如this one),但我确实需要最短阻力的路径。
我有一个实体,它与我的Java代码中表示为enum的值具有一对多的关系。我创建了应该捕获许多方面的表,如下所示:
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会从数据库中将这些枚举值的列表加载到我的实体中?
答案 0 :(得分:0)
答案结果是我之前拒绝的typedef
方法加上包含缺失的依赖项。
我没有意识到在{Hibernate Annotations JAR中定义了org.hibernate.type.EnumType
,所以我添加了
<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
方法应该有效。