Dozer не может отобразить постоянный пакет Hibernate в список - PullRequest
2 голосов
/ 12 ноября 2011

Я реализую веб-сервис отдыха на 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.

Я не могу выяснить, что я делаю неправильно, почему Дозер может сопоставить A с B, но не B с A.

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

1 Ответ

1 голос
/ 15 ноября 2011

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

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

...