Я использую Spring и JPA и создаю запрос на обновление. Обновляется правильно. Но я также хочу обновить текущее время.
Изначально хотел просто использовать @UpdateTimestamp над полем timestamp. Это не выбрасывает ошибки. Обновление происходит для других столбцов, но без изменения в отметке времени.
Код следующий:
Сущность
@Getter
@Setter
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class MyEntity {
@EmbeddedId
private SomeClass someClass;
@Column("name")
private String name;
@MapsId("number")
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "NUMBER")
private NumEntity numEntity;
// this annotation makes no diff and date does not change
@UpdateTimestamp
@Column(name = "CREAT_TS")
private Timestamp createdTimestamp;
}
Репо
@Repository
public interface MyRepository extends CrudRepository<MyEntity, SomeClass> {
@Modifying
@Query("UPDATE MyEntity e SET e.name =:name WHERE e.someClass.id =:id")
void updt(@Param("id") int id, @Param("name") String name);
}
Метод создания обновления
@Transactional
public void myMethod(int id, String name) {
myRepository.updt(id, name);
}
В качестве альтернативы я попытался обновить отметку времени в самом запросе следующим образом. Это выдает ошибку, когда я пытаюсь запустить myMethod. Пожалуйста, совет, хорошо с решением для любого сценария ios. Спасибо.
Ошибка
CAUSE = InvalidDataAccessResourceUsageException: Именованный параметр не привязан: CURRENT_TIMESTAMP; Вложенное исключение: org.hibernate.QueryException: Именованный параметр не привязан: CURRENT_TIMESTAMP
Репо с использованием текущей отметки времени в запросе.
@Repository
public interface MyRepository extends CrudRepository<MyEntity, SomeClass> {
@Modifying
@Query("UPDATE MyEntity e SET e.createdTimestamp =:CURRENT_TIMESTAMP, e.name =:name WHERE e.someClass.id =:id")
void updt(@Param("id") int id, @Param("name") String name);
}
ОБНОВЛЕНИЕ:
Вернулись к использованию пометки метки времени в классе сущностей следующим образом:
@UpdateTimestamp
@Column(name = "CREAT_TS")
private Timestamp createdTimestamp;
Вместо написания пользовательского запроса, используя команду сохранения в выполнить обновление, как указано в комментариях.
@Transactional
public void myMethod(SomeClass someClass, String name) {
MyEntity myEntity = myRepository.findById(someClass); // works
myEntity.setName("david");
myRepository.save(myEntity);
}
Если поле имени myEntity для этой сущности уже называется «Дэвид», ничего не происходит, ошибок нет, обновлений нет. Если «david» - это новое имя (скажем, ранее имя было Dan), обновляется только отметка времени, но имя остается как «david». Кто-нибудь может увидеть, что я здесь делаю неправильно?