Аннотированное поле @CreatedDate не записано на вставке, @LastModifiedDate - PullRequest
0 голосов
/ 11 июня 2019

Я создал следующую сущность и протестировал ее, используя h2:

@Getter
public class Topic {

    @Id
    private long id;

    private final Title title;

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime lastModified;

    // ...
}

TopicRepository - пустой интерфейс.

Следующий тест не пройден с ошибкой, что createdAt имеет значение null:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BasicRepositoryTests {

    @Autowired
    TopicRepository topicRepository;

    @Test
    public void topicRepositoryWorks() {
        val topic = new Topic();
        val savedTopic = topicRepository.save(topic);

        assertEquals(1, topicRepository.count());
        assertNotNull(savedTopic.getLastModified(), "lastModified must be set");
        assertNotNull(savedTopic.getCreatedAt(), "createdAt must be set");

        topicRepository.delete(savedTopic);

        assertEquals(0, topicRepository.count());
    }

}

Мое приложение помечено @SpringBootApplication и @EnableJdbcAuditing.

Почему createdAt все еще null, lastModified с другой стороны, не равно нулю?

Редактировать

Я изменил типы Topic.createdAt и Topic.lastModified на Instant, которые не работали.

Кроме того, я добавил следующий метод, который, я думаю, должен обеспечивать значения для полей Instant:

@Bean
public AuditorAware<Instant> instantAuditorAware() {
    return () -> Optional.of(Instant.now());
}

К сожалению, хотя метод вызывается, createdAt по-прежнему null.

1 Ответ

1 голос
/ 13 июня 2019

Аудит аннотаций учитывается только для совокупного корня. Если информация об аудите необходима для сущностей, которые являются частью совокупного, но не сводного корня, это можно сделать, внедрив ее в сводный корень, который должен управлять всеми изменениями в нем и сущностях совокупности.

Хотя исходный код, размещенный в вопросе, говорит о том, что вы на самом деле смотрите на сводный корень, код, который вы сделали доступным через Github, показывает, что аннотация в корне работает нормально, а в некорневой сущности не так, как описано выше.

Вам не нужен AuditorAware боб. Это нужно только для @CreatedBy и @LastModifiedBy.

...