【发布时间】:2014-11-14 11:31:33
【问题描述】:
两个实体:Customer、CustomerAddress - Customer 有 List<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 中使用的未使用/额外字段
来自更新方法的片段:
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 和 gisLocation 设置为 null - 这些应保留原始值)
【问题讨论】:
-
经过更多调查,似乎 Orika 正在创建一个新的 List
而不是映射到已经存在的列表中 -
记录为 orika 的错误:code.google.com/p/orika/issues/detail?id=181