Обновление @Updatetimestamp без изменения данных сущности

#java #spring #hibernate #spring-data-jpa

Вопрос:

Детство имеет отношение «многие к одному» к родительству

Родительство, имеет:

 @Version
@UpdateTimestamp
protected LocalDateTime modificationTime;
 

Требование состоит в том, что время изменения строки родительского элемента должно обновляться при создании или изменении дочернего элемента (в контексте @Transactional) с помощью ChildRepository extends JPARepository

Единственный способ, который мы в настоящее время видим, — это создать метод updateModificationTime и задать его явно, задаваясь вопросом, есть ли лучший способ?

Как мы можем обновить время модификации с аннотацией @UpdateTimestamp без изменения каких-либо данных родительского элемента?

репо на github: https://github.com/daveyx/spring-playground/tree/main/210427-datatest

тестовый случай: https://github.com/daveyx/spring-playground/blob/main/210427-datatest/src/test/java/com/example/datatest/child/ChildServiceIntegrationTest.java

Комментарии:

1. Вы уже пробовали аннотировать сущность с @DynamicUpdate помощью?

2. спасибо, пытался @DynamicUpdate , но безуспешно. Кроме того, нам не нравятся недостатки этой аннотации

3. Что значит «без успеха»? Это также требует, чтобы сохранение всегда проходило через родителя, а дочерняя коллекция каскадировалась MERGE и использовалась @OptimisticLock . Какие недостатки?

4. никакого успеха, если просто сохранить родителя github.com/daveyx/spring-playground/blob/main/210427-datatest/… при сохранении через родителя без изменения данных. Сохранение через родителя также работает без @DynamicUpdate , но это не то, что мы хотим. Мы хотим сохранить ребенка и просто коснуться родителя, чтобы обновить @UpdateTimestamp Недостатком @DynamicUpdate является то, что hibernate необходимо мгновенно создавать SQL и не может использовать предварительно определенный SQL.

5. В этом случае ваш единственный вариант-использовать, например entityManager.lock(parent, OPTIMISTIC_FORCE_INCREMENT)

Ответ №1:

Как предположил Крис, OPTIMISTIC_FORCE_INCREMENT кажется, это «правильный» путь для нас. Получение родительской сущности в контексте транзакции обновляет @UpdateTimestamp аннотированное свойство:

 public interface ParentRepository extends JpaRepository<ParentEntity, Long> {

@Lock(LockModeType.OPTIMISTIC_FORCE_INCREMENT)
@Query("SELECT pe FROM ParentEntity pe WHERE pe.id = :parentId")
ParentEntity findByIdForceIncrement(@Param("parentId") Long parentEntityId);