2015-10-21 2 views
0

Я встретил очень странное явление при использовании бульдозера в проекте jpa. У меня есть объект UserSupplier и объект поставщика.Странное явление при использовании бульдозера в проекте jpa, почему аннотация для отображения в ленивом объекте загрузки не может работать?

UserSupplier: 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "supplier_id", nullable = false) 
private Supplier supplier; 

В моем коде я сначала запрошу список UserSupplier, а затем преобразую его в список поставщиков.

List<Supplier> supplierList = new ArrayList<>(usList.size()); 
usList.forEach(us -> supplierList.add(us.getSupplier())); 

Затем я конвертирую список поставщиков в список поставщиков и возвращаю его в Caller.

BeanMapper.mapList(supplierList, SupplierView.class); 

Мой бульдозер настроить в этих объектах, как ниже

Supplier: 
@Id 
@GeneratedValue 
@Mapping("supplierId") 
private int id; 

SupplierView: 
private int supplierId; 

Очень смешно, SupplierID в SupplierView всегда 0 (значение по умолчанию) ИНТ, но и другие fileds можно преобразовать успешно, только поле идентификатор из строя. Я не понимаю, почему это так, почему только поле id не может преобразовать в vendId, но могут быть другие поля?

Для вышеуказанной проблемы, есть ниже растворы

1. Change field name (supplierId to id): 

Supplier: 
// @Mapping("supplierId") 
private int id; 

SupplierView: 
private int id; 

but Caller(front-end) have to change code. 

2. Change fetchType to eager: 

UserSupplier: 
@ManyToOne 
private Supplier supplier; 

ответ

0

Это, вероятно, потому, что JPA использует прокси-объекты для отложенной загрузки единой ссылки на объект. Объект прокси - это действительно подкласс класса сущности. Думаю, что бульдозер может найти аннотацию @Mapping только по полям, объявленным в классе данного объекта, а не по полям, определенным в родительских классах. Проект бульдозера утверждает, что отображение аннотации experimental. Поэтому вполне возможно, что он не охватывает иерархии классов отображения.

Предлагаю попробовать настроить сопоставление поставщикаId другими способами (XML, API отображения dozer) и посмотреть, работает ли он. Если все не удается, вы можете написать настраиваемый конвертер MapperAware между Supplier и SupplierView. Вы сопоставляли бы исходный объект с целевым объектом с помощью предоставленного сопоставления и завершали его, копируя значение id в supplierId.

+0

Спасибо! Бог! Аннотация экспериментальна, теперь я знаю, почему ее функция настолько бедна. Но другие манеры настолько громоздки, особенно когда они используются с весенним ботинком. Я буду искать лучшую замену. – zhuguowei

+0

Я столкнулся с [Model mapper] (http://modelmapper.org). После моего опыта работы с громоздким и глючным бульдозером я попробовал modelmapper в своих следующих проектах. Если вы попробуете это, я буду рад обратной связи, поскольку я еще не пробовал его ни в каком проекте. – OndrejM

+0

Да, есть много заменителей, таких как orika, jmapper, mapstruct. Потому что я предпочитаю настройку аннотации. Возможно, я попробую jmapper (https://github.com/jmapper-framework/jmapper-core) – zhuguowei

0

После прочтения документации по бульдозеру я нахожу кое-что. Попробовав это, я получил еще одно решение. То есть добавить dozer.properties в путь к классам, содержание внутри

org.dozer.util.DozerProxyResolver=org.dozer.util.HibernateProxyResolver 

Более подробно см http://dozer.sourceforge.net/documentation/proxyhandling.html

 Смежные вопросы

  • Нет связанных вопросов^_^