Как сделать глубокое копирование внутренних объектов из Hibernate Entity в DTO? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть класс сущности

public Class StudentEntity{
    private int id;
    private String name;
    private AddressEntity address;
    private ProfileEntity profile;
    //getter setter
}

public Class StudentDTO{
    private int id;
    private String name;
    private AddressDTO address;
    private ProfileDTO profile;
    //getter setter
}

когда я использую BeanUtils.copyProperties(); (из пружины / apache common), он копирует только id и name. Как скопировать address и profile также?

Если нужно написать custom util, не могли бы вы поделиться фрагментом?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

BeanUtils , клонирование ИЛИ сериализация не будет работать здесь, поскольку внутренние типы данных отличаются. Я бы предложил вам установить поля StudentDTO вручную. Вы можете использовать конструктор преобразования для AddressDTO и ProfileDTO. Конструктор копирования является допустимым именем, но поскольку мы также преобразуем тип, лучшим именем будет конструктор преобразования.

Примером конструктора преобразования в JDK является ArrayList(Collection<? extends E> c), т.е. https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#ArrayList-java.util.Collection-, который генерирует ArrayList из любого объекта Collection и копирует все элементы из объекта Collection во вновь созданный объект ArrayList.

Пример:

StudentEntity studentEntityObj = new StudentEntity();
studentEntityObj.setId(1);
studentEntityObj.setName("myStudent");
AddressEntity addressEntityObj = new AddressEntity();
addressEntityObj.setCity("myCity");
studentEntityObj.setAddress(addressEntityObj);
// All above lines would be taken care of already (i.e. data is filled from DB)

StudentDTO studentDTOObj = new StudentDTO();
// Call conversion constructor  
AddressDTO addressDtoObj = new AddressDTO(addressEntityObj);
studentDTOObj.setAddress(addressDtoObj);
studentDTOObj.setId(studentEntityObj.getId());
studentDTOObj.setName(studentEntityObj.getName());
System.out.println(studentDTOObj.toString());

где AddressDTO (ИЛИ ProfileDTO в этом отношении), включая конструктор преобразования, выглядит так:

public class AddressDTO {

    private String city;

    // Conversion constructor  
    public AddressDTO(AddressEntity a) {
        this.city = a.getCity();
    }

    @Override
    public String toString() {
        return "AddressDTO [city=" + getCity() + "]";
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

отпечатков

StudentDTO [id=1, name=myStudent, address=AddressDTO [city=myCity]]

0 голосов
/ 10 мая 2018

Вы можете попробовать использовать SerializationUtils.clone (). Этот метод глубоко клонирует ваш объект. Но вы должны пометить ваши объекты как Сериализуемые.

https://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/SerializationUtils.html#clone(T)

...