Я хочу использовать 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
}
}
Мы ожидаем заменить реализацию updateB инструкцией modelMapper, которая отображаетвсе поля и отслеживает исторические изменения для добавления в базу данных.
Наш текущий код работает, но требует повторной реализации исторического события для каждого поля вместо того, чтобы записывать реализацию один раз и позволять modelMapper выполнять тяжелую работу.