Spring jpa @PreUpdate не работает должным образом - PullRequest
0 голосов
/ 16 мая 2019

Я столкнулся с проблемой при обновлении не вызванного метода сущности @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 (), если с объектом произошло обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...