Проблема, которую я обнаружил, заключается в том, что поведение JPA заключается в том, что всегда необходимо внести изменения в объект, чтобы вызвать PreUpdate с помощью save(). Мне нужен способ найти объект в базе данных и, скажем, обновить дату с помощью PreUpdate.
Мой код выглядит следующим образом:
@NoArgsConstructor
@AllArgsConstructor
@Data
@DynamicUpdate
@Entity
@Table(name = "Table")
public class TableEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "uuid2"
)
@Column(name = "Id", nullable = false)
private String id;
@Column(name = "Something")
private String something;
@Column(name = "Fecha")
private LocalDateTime fecha;
@PreUpdate
private void update() {
setFecha(LocalDateTime.now());
}
}
Репозиторий — это пустой репозиторий без какого-либо специального метода. У меня есть служба, которая автоматически подключает репозиторий. Тогда у меня есть такой метод:
@Transactional
public InformationDTO save(String id) {
TableEntity entity = capRepository.findById(id);
entity.setSomething("mock");
repo.save(entity);
[...]
return new InformationDTO();
}
Если я это сделаю, PreUpdate вызовет счастливые дни, но если вместо этого я выполню этот метод,
@Transactional
public InformationDTO save(String id) {
TableEntity entity = capRepository.findById(id);
repo.save(entity);
[...]
return new InformationDTO();
}
это не вызовет PreUpdate.
Есть ли способ запустить PreUpdate без каких-либо изменений объекта?
Вы можете просто вызвать update
самостоятельно.
Вы можете сделать это при загрузке объекта :)
Я пытался сделать PreUpdate на 100% невидимым для разработчика, но, похоже, им нужно будет вызвать update(). Спасибо за вашу помощь :)