Dozer无法将Hibernate的persistentBag映射到List

时间:2011-11-12 19:19:43

标签: java hibernate mapping dozer

我正在Java中实现一个休息Web服务作为大学任务,所以我对这些事情很陌生,因此我可能以错误的方式做这件事。

无论如何,问题是Dozer无法将Hibernate PersistentBag映射到java.util.List

我正在映射两个类:AB

List<Department> A.departments

映射到

DepartmentsType B.departments

DepartmentsType只有一个属性

List<DepartmentType> departments

所以最后A.departments映射到B.departments.departments,实际上这就是映射:

<mapping>
    <class-a>it.unitn.lsde.persistence.A</class-a>
    <class-b>it.unitn.lsde.generated.B</class-b>

    <field>
        <a>name</a>
        <b>name</b>
    </field>
    <field>
        <a>city</a>
        <b>city</b>
    </field>
    <field> 
        <a>departments</a>
        <b>departments.departments</b>
        <a-hint>it.unitn.lsde.persistence.Department</a-hint>
        <b-hint>it.unitn.lsde.generated.DepartmentType</b-hint>
    </field>
    <field>
        <a>code</a>
        <b>code</b>
    </field>
</mapping>

这是我定义A.departments(Hibernate)的方式:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "university", cascade = CascadeType.ALL)
protected List<Department> departments = new ArrayList<Department>();

这是我定义B.departments

的方式
DepartmentsType departments;

最终这就是DepartmentsType.departmens的定义方式:

List<DepartmentType> departments;

每当我尝试将class A映射到class B时,我都会从Dozer中获得Field Mapping Error

Source parent class: B
Source field name: departments
Source field type: class org.hibernate.collection.PersistentBag
Source field value: [it.unitn.lsde.persistence.Department@12b3c6b]
Dest parent class: A
Dest field name: departments.department
Dest field type: java.util.List

异常堆栈指出这段代码有问题:

return (B) mapper.map((A)session.get(A.class, id), B.class);

但是,当我将class B映射到class A时,一切都按预期工作。 我知道,由于多种原因,Hibernate将我定义为List的内容转换为PersistentBag,但这应该是List本身。

我无法找出我做错了什么,为什么Dozer可以将A映射到B而不是B映射到A

提前致谢

1 个答案:

答案 0 :(得分:1)

经过几个小时的搜索,我发现我在DepartmentsTypeB.departments)课程中错过了列表的设置者。

如果没有setter,Dozer就无法映射来自Hibernate的列表。