Я столкнулся с проблемой при обновлении не вызванного метода сущности @preUpdate.
, но при создании записи она работает правильно, вызывая метод @prePersist.
Spring boot - 2.1.4Релиз
Я пытался создать другую транзакцию, но безуспешно, а также, если я сделаю это вручную, установив поля, она будет работать как setMaskedDate (date);
здесь моя сущность
@Table(name = "PROCESS_SUBJECT")
@Data
public class ProcessSubject {
@Id
@Column(name = "ID", length = 50, unique = true, nullable = false, insertable = true, updatable = false)
private String id;
@Column(name = "SUBJECT_DATE", nullable = true, length = 100, columnDefinition = "varchar(100)")
private String encryptedSubjectDate;
// Subject Date (Hack instead of Transient since Transient has issues
//with Updates)
@Column(name = "SUBJ_DATE", insertable = false, updatable = false)
private Date subjectDate;
@Column(name = "MASKED_SUBJECT_DATE", nullable = true, length = 100)
private String maskedSubjectDate;
public void setSubjectDate(Date subjectDate) {
this.subjectDate = subjectDate;
this.encryptedSubjectDate = null;
}
@PrePersist
public void prePersist() {
this.id = StringUtil.getRandomUUID();
encrypt();
}
@PreUpdate
public void preUpdate() {
encrypt();
}
@PostLoad
public void postLoad() {
decrypt();
}
private void decrypt() {
if (StringUtils.isNotBlank(encryptedSubjectDate)) {
String subjectDateStr = EncryptUtil.aesDecrypt(encryptedSubjectDate, this.id);
try {
this.subjectDate = DateUtil.getDate(subjectDateStr, DateUtil.Patterns.ISO_DATE);
} catch (Exception e) {
this.subjectDate = new Date();
}
}
}
private void encrypt() {
if (subjectDate != null) {
String dateStr = DateUtil.printDateStr(subjectDate, DateUtil.Patterns.ISO_DATE);
this.encryptedSubjectDate = EncryptUtil.aesEncrypt(dateStr, this.id);
this.maskedSubjectDate = DateUtil.printDateStr(subjectDate, DateUtil.Patterns.MM_DD);
}}
}
вот код внутри транзакции
@Transactional
@Override
public void updateData(int id){
Optional<Language> languageOpt =languageRepository.findById(id);
if(languageOpt.isPresent()){
ProcessSubject subject = languageOpt.get().getSubject();
subject.setSubjectDate(new Date());
processSubjectRepository.save(subject);
}}
Я хочу вызвать метод encrypt (), если с объектом произошло обновление.