@CreationTimestamp @UpdateTimestamp недоступен сразу после обновления класса сущности - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть объект User, который я обновляю.Данные были обновлены, и даже обновленный ответ возвращается методом spring-data-jpa save, но created и updated равны нулю.Я проверил это в базе данных и там значение столбца updated обновляется.Кроме того, после обновления я получил данные одним из методов find по spring-data-jpa и получил правильный результат.created и updated не равны нулю на этот раз.

import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;


    @Column(name = "created", updatable = false, nullable = false)
    @CreationTimestamp
    @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime created;

    @Column(name = "updated")
    @UpdateTimestamp
    @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime updated;

Я не могу винить метод save, так как он возвращает мне обновленное значение другого поля.В работе @UpdateTimestamp и @CreationTimestamp может быть что-то подозрительное или с его совместимостью с spring-data-jpa Я не уверен, хотя.

Одно быстрое наблюдение с spring-data-jpa: если я использую saveAndFlush вместо save я получаю updated в качестве допустимого значения, но created по-прежнему равно нулю.Вот скриншоты отладки:

save saveAndFlush

Я использую Hibernate в качестве реализации JPA.

public interface CompanyDao extends CrudRepository<Company, Integer> { }


public User update(Integer userId, User user) {

    User existingUser = userDao.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found"));

    user.setCompany(existingUser.getCompany());

    User updatedUser = userDao.save(user);

    return updatedUser;
}

1 Ответ

0 голосов
/ 21 сентября 2019

Вы можете использовать @CreatedDate и @LastModifiedDate аннотации из Spring.

@Entity
@EntityListeners(AuditingEntityListener.class)
public class User {

    @Column(name = "created_at")
    @Temporal(TemporalType.TIMESTAMP)
    @CreatedDate
    private Date createdAt;

    @Column(name = "updated_at", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    @LastModifiedDate
    private Date updatedAt;

}

Для этого необходимо аннотировать конфигурацию пружины аннотацией @EnableJpaAuditing

@Configuration
@EnableJpaAuditing
public class ApplicationConfiguration {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...