私は大学の課題としてJavaで残りのWebサービスを実装しているので、そのようなことはまったく初めてなので、おそらく間違った方法でやっています。
PersistentBag
とにかく問題は、Dozer が Hibernateを にマップできないことjava.util.List
です。
私は2つのクラスをマッピングしています:A
とB
,
List<Department> A.departments
にマッピングされます
DepartmentsType B.departments
DepartmentsType
というプロパティが 1 つだけあります。
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;
a にマップしようとするたびに、class A
Dozerからclass B
a を取得します。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
前もって感謝します