Dozer не может сопоставить persistentBag Hibernate со списком

Я реализую веб-сервис отдыха на Java в качестве университетского задания, поэтому я новичок в таких вещах, поэтому, вероятно, я делаю это неправильно.

В любом случае проблема в том, что Dozer не может сопоставить Hibernate PersistentBag с java.util.List.

Я сопоставляю два класса: A и B,

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, я получаю Field Mapping Error от Dozer:

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.

заранее спасибо


person Dalen    schedule 12.11.2011    source источник


Ответы (1)


После нескольких часов поиска я обнаружил, что мне не хватало установщика списка в классе DepartmentsType (B.departments).

Без этого установщика Dozer не смог отобразить список из Hibernate.

person Dalen    schedule 15.11.2011