2017-01-24 6 views
1

Это распространенная проблема для разработчиков веб-сервисов, которые хотели бы сразу возвращать классы объектов. Даже если все данные, которые мне нужны, загружены, все еще есть много неинициализированных прокси и коллекций, которые мне не нужны. Я бы хотел, чтобы они просто вернули нуль и не выбрали Lazy Load Exception. В принципе, мне просто нужен контракт POJO, однако для его получения нужно очистить прокси-серверы и спящие коллекции (если в спящем режиме нет какого-то нового способа, о котором я не знаю). Могу ли я использовать MapStruct для этого?Может ли MapStruct сделать глубокое депроксирование классов сущностей Hibernate

Подробнее об этом в случае необходимости:

http://www.mojavelinux.com/blog/archives/2006/06/hibernate_get_out_of_my_pojo/

http://www.gwtproject.org/articles/using_gwt_with_hibernate.html

Gilead было единственное, что я обнаружил, что работал хорошо для этого, но это уже не вокруг.

ответ

1

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

Допустим, у вас есть эти классы:

public class Car { 

    private String name; 
    private int year; 
    //This is lazy loaded 
    private List<Wheel> wheels; 
    //getters and setters omitted for simplicity 
} 

public class Wheel { 
    private boolean front; 
    private boolean right; 
    //getters and setters omitted for simplicity 
} 

понадобится картографа, который выглядит следующим образом:

@Mapper 
public interface CarMapper { 

    @Mapping(target="wheels", ignore=true) 
    Car mapWithoutWheels(Car car); 

    Car mapWithWheels(Car car); 

    List<Wheel> map(List<Wheel> wheels); 

    Wheel map(Wheel wheel); 
} 

Явное отображение для List<Wheel> и Wheel необходим, если вы хотите, чтобы заставить MapStruct для создания новых объектов, а не для прямого сопоставления. В настоящее время, если MapStruct видит, что исходный и целевой тип одинаковы, он выполняет прямое назначение (со списками он будет создавать новый список, но он не будет вызывать геттеры в элементах списка).

Если Wheel были некоторые ленивые нагруженные элементы, то вы можете иметь 2 метод для отображения Wheel и вы должны будете использовать selection based on qualifiers

+0

Это немного руководства, но работает хорошо, спасибо! –

+0

Я согласен, что это немного руководство. Однако, если у вас есть представление о том, как его можно улучшить, вы можете создать проблему [здесь] (https://github.com/mapstruct/mapstruct/issues/) – Filip

+0

Я протестировал что-то подобное на '1.1.0.Final 'но похоже, что это не работает. –