首页 > 解决方案 > 如何将内部对象从 Hibernate Entity 复制到 DTO?

问题描述

我有实体类

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
}

当我使用(来自spring / apache common)时,它会单独BeanUtils.copyProperties();复制idand 。name怎么复制addressandprofile也?

如果必须编写自定义实用程序,您能分享一下代码片段吗?

标签: javaspring-beanapache-commons-beanutils

解决方案


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-从任何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]]


推荐阅读