为什么Orika将嵌套List的未使用字段映射为null?

时间:2014-11-14 11:31:33

标签: java orika

两个实体:CustomerCustomerAddress - CustomerList<CustomerAddress>

public class Customer implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String name;

    //bi-directional many-to-one association to CustomerAddress
    @OneToMany(mappedBy="customer", fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    private List<CustomerAddress> customeraddresses;

    private String identifier;

    private String aliasId;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(updatable=false)
    private Date createdDateTime;

    // Getters and Setters
}
public class CustomerAddress implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String line;

    //bi-directional many-to-one association to Customer
    @ManyToOne
    @JoinColumn(name="customerId")
    private Customer customer;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(updatable=false)
    private Date createdDateTime;

    private String gisLocation;

    // Getters and Setters
}

相应的DTO:

public class CustomerDTO {
    private int id;
    private String name;
    private String aliasId;
    private List<CustomerAddressDTO> customeraddresses;
    // Getters and Setters
}
public class CustomerAddressDTO {
    private int id;
    private String line;
    // Getters and Setters
}

注意:实体中有未使用/额外的字段,未在DTO中使用

来自Update方法的

Snippet:

Customer oldCustomer = customerDao.getCustomerById(dto.getId());
mapper.map(dto, oldCustomer);

现在,在这个映射器调用之后,List中未使用的字段被设置为null(这是不对的)

确保Orika在嵌套列表中保留未使用的字段的正确性是什么?


(如果需要,附加信息):

oldCustomer before mapping: Customer [id=2, name=Customer1, customeraddresses=[CustomerAddress [id=7, line=ABCD**, createdDateTime=Sat Jan 01 00:00:00 IST 2000, gisLocation=1], CustomerAddress [id=13, line=0000, createdDateTime=Mon Jan 01 00:00:00 IST 2001, gisLocation=2]], identifier=id1, aliasId=1234, createdDateTime=Tue Dec 12 00:00:00 IST 2000]
dto used for mapping: CustomerDTO [id=2, name=Customer1, aliasId=1234, customeraddresses=[CustomerAddressDTO [id=7, line=ABCD**], CustomerAddressDTO [id=13, line=0000]]]
oldCustomer after mapping: Customer [id=2, name=Customer1, customeraddresses=[CustomerAddress [id=7, line=ABCD**, createdDateTime=null, gisLocation=null], CustomerAddress [id=13, line=0000, createdDateTime=null, gisLocation=null]], identifier=id1, aliasId=1234, createdDateTime=Tue Dec 12 00:00:00 IST 2000]

(注意:createdDateTime a和gisLocation设置为null - 这些应保留原始值)

1 个答案:

答案 0 :(得分:0)

在Orika中,这是默认行为,您也可以通过提供合并两个集合的映射器来自定义此行为。在项目的测试代码中有例子。

请查看此示例:CustomMerge