JPA Auditing LastModifiedBy / LastModifiedDate являются нулевыми при доступе в методе транзакции - PullRequest
0 голосов
/ 23 января 2019

У меня настроен одитинг, как показано ниже, и он работает нормально. Проблема в том, что когда я хочу получить доступ к ним в транзакционном методе перед обновлением, идентификатор / дата обновления всегда равны нулю, и я не уверен, почему.

@CreatedBy
@Column(name = "CREATE_ID", updatable = false, nullable = false)
private String createId;

@LastModifiedBy
@Column(name = "UPDATE_ID", nullable = false)
private String updateId;

@CreatedDate
@Column(name = "CREATE_DATE", updatable = false, nullable = false)
private Date createDate;

@LastModifiedDate
@Column(name = "UPDATE_DATE", nullable = false)
private Date updateDate;

Методы создания / обновления, которые вызывают save.

Примечание: ОБА из них работают нормально, создавая / обновляя записи в базе данных с правильными значениями аудита создания / обновления. Проблема в том, что я не могу получить доступ к идентификатору / дате обновления в методе обновления, и я Я не уверен, почему / как это исправить.

@Override
@Transactional
public MyObj create(MyObj myObj) {
    MyObj createdMyObj = myObjRepo.save(myObj);
    System.out.println(createdMyObj.getCreateId()); // This works fine
    return createdMyObj;
}

@Override
@Transactional
public MyObj update(MyObj myObj) {
    MyObj updatedMyObj = myObjRepo.save(myObj);
    System.out.println(updatedMyObj.getUpdateId()); // This is null
    return updatedMyObj;
}

1 Ответ

0 голосов
/ 24 января 2019

Функция аудита Spring Data JPA основана на событиях жизненного цикла JPA, а событие PreUpdate, используемое для установки последних измененных столбцов , запускается только тогда, когда реализация JPA фактически обновляет базу данных, которая находится вво многих случаях в конце транзакции.

См. раздел 3.5.3 спецификации JPA :

Обратные вызовы PreUpdate и PostUpdate происходят до и послеОперации обновления базы данных до данных объекта соответственно.Эти операции с базой данных могут происходить во время обновления состояния объекта или могут происходить во время сброса состояния в базу данных (что может быть в конце транзакции).

Следовательно, есливы хотите, чтобы эти значения были установлены, вам нужно очистить контекст постоянства.

...