使用xml配置的@ElementCollection

时间:2014-09-08 08:45:38

标签: java hibernate collections

我试图将具有一组字符串的对象持久化到数据库,我发现必须使用@ElementCollection来执行此操作,但因为我使用.hbm.xml通过我的所有项目配置文件我想使用xml来完成它。 此问题Hibernate, List<String>显示了如何通过注释执行此操作,此链接http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection提供了使用xml执行此操作的提示。但是当我尝试使用<element-collection>时,我的eclipse IDE并没有接受它,并在元素<class/>上给出了一个错误,上面写着the contents of element class must match ...

我的班级就像这样

public class Role {
private Long id;
private Integer version;
private String name;
private Set<String> menuItems;
/** getters and setters **/

我的Role.hbm.xml是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.element.collection.beans">
    <class name="Role" table="Role">
    <id name="id" type="java.lang.Long" column="id">
        <generator class="org.hibernate.id.TableHiLoGenerator">
            <param name="table">HibernateUniqueKey</param>
            <param name="column">NexHiValue</param>
        </generator>
    </id>
<version name="version" column="Version" />
<property name="name" column="name" type="java.lang.String"
        not-null="true" length="128" />

 <element-collection name="menuItems">
<collection-table>menuItems</collection-table>
</element-collection>

</class>

更新:

这是集合的最后一个映射,其余的没有改变

    <set name="menuItems" sort="unsorted" table="menuItems" lazy="false">
        <key column="itemId" />
        <element column="itemName" type="string" />
    </set>

1 个答案:

答案 0 :(得分:3)

检查文档:

来自该来源的例子:

<set name="aliases"
            table="person_aliases" 
            sort="natural">
    <key column="person"/>
    <element column="name" type="string"/>
</set>

答案是<element>

<element>可用于任何类型的集合映射,例如<bag> <set> <list> ...

也可能很有趣:Understading the restrictions for collection of dependent objects in hibernate ...

基于更多细节,我们可以说,这里的映射就像:

<class name="Role" table="Role">
    ...

    <set name="menuItems" sort="unsorted" table="menuItems" lazy="false">
        <key column="menuId" /> // not itemId
        <element column="itemName" type="string" />
    </set>
</class>