我想使用ModelMapper
快速将我的dto
映射到entity
对象,反之亦然,但是当成功写入数据库时,我还需要记录事务
我希望使用某种包装器来扩展ModelMapper
:
检查源值和目标值是否存在差异
格式化要添加到“历史记录”表(这是功能请求)的给定对象的数据更改
对于此请求,我们需要在易于格式化的3NF表中跟踪任何现场数据更改,然后可以将其读取到历史记录部分中。在某些情况下,我们的旧对象被修补,而其他对象被完全覆盖,因此,虽然对象A可能具有更新一个字段的服务,而对象B却具有立即更新所有字段的服务
到目前为止,我们已经尝试使用可能有效的方面,但是解决方案很复杂,并且涉及ThreadLocal
并发。我们还尝试了Spring EventListener
,但是这种情况下仍然容易发生比我们认为绝对必要更多的代码重复。
public class ServiceA {
// this method is only executed if the amounts are different
// this is checked by the front end
public void updateAmount(int amount, A entity){
int oldAmount = entity.amount;
entity.amount = amount;
// add historic record changed A's amount from 'oldAmount' to 'amount'
// save A
// save historic record if A saves
}
public class ServiceB {
@Autowired
private ModelMapper modelMapper;
public void updateB(DTO dto, A entity){
// We want to replace this with
// entity = modelMapper.map(dto, entity)
if(dto.amount != entity.amount){
// add historic record changes amount
entity.amount = dto.amount;
}
if(dto.price != entity.price){
// add historic record changed price
entity.price = dto.price;
}
// save B
// save historic records if B saves
}
}
我们期望用modelMapper指令替换updateB实现,该指令映射所有字段并跟踪历史更改以追加到数据库。
我们当前的代码有效,但需要重新实现每个字段的历史事件,而不是一次编写实现并让modelMapper承担繁重的工作。