#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);