@CreatedDate аннотация не работает с MySQL

Я новичок в весне, и я запутался, как аннотация @CreatedDate работает в сущности.

Я сделал поиск в Google, и было много решений, но ни одно из них не помогло мне, кроме одного. Я запутался почему?

Это то, что я попробовал первым

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

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @CreatedDate
    private Date created;

    public User(String name) {

        this.name = name;
    }

    public User() {
    }

Это не работает. Я получил NULL за значение в created колонка.

Тогда я сделал это.

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

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @CreatedDate
    private Date created = new Date();

    public User(String name) {

        this.name = name;
    }

    public User() {
    }

Это фактически сохранило отметку времени в БД. Мой вопрос состоит в том, что большинство руководств, которым я следовал, предлагали мне не new Date() чтобы получить текущую отметку времени. Похоже, мне это нужно. Есть что-то, что я пропускаю?

6 ответов

Решение

@CreatedDate не будет работать само по себе, если вы просто положите @EntityListeners(AuditingEntityListener.class) на ваших сущностях. Для того, чтобы все заработало, вам нужно сделать немного больше настроек.

Допустим, что в вашей БД поле @CreatedDate имеет тип String, и вы хотите вернуть пользователя, который в данный момент вошел в систему, в качестве значения для @CreatedDateзатем сделайте это:

public class CustomAuditorAware implements AuditorAware<String> {

    @Override
    public String getCurrentAuditor() {
        String loggedName = SecurityContextHolder.getContext().getAuthentication().getName();
        return loggedName;
    }

}

Вы можете написать там любую функциональность, которая соответствует вашим потребностям, но у вас обязательно должен быть компонент, ссылающийся на класс, который реализует AuditorAware.

Вторая и не менее важная часть заключается в создании компонента, который возвращает этот класс с аннотацией @EnableJpaAuditing, как это:

@Configuration
@EnableJpaAuditing
public class AuditorConfig {

    @Bean
    public CustomAuditorAware auditorProvider(){
        return new CustomAuditorAware();
    }
}

если ваш яд - конфигурация XML, то сделайте это:

<bean id="customAuditorAware" class="org.moshe.arad.general.CustomAuditorAware" />
    <jpa:auditing auditor-aware-ref="customAuditorAware"/>

У меня тоже была эта проблема, и ваше решение помогло мне, спасибо, и я добавляю некоторые другие аннотации для работы

Сначала убедитесь, что вы установили конфигурацию SpringApplication

@SpringBootApplication
@EnableJpaAuditing

Во-вторых, убедитесь, что вы используете эту аннотацию для необходимых вам объектов.

  @Entity
  @Table
  @EntityListeners(AuditingEntityListener.class)

Вы можете использовать @creationTimestamp и @UpdateTimestamp, как показано ниже.

Если вы хотите использовать классы времени java8:

      @EnableJpaAuditing(dateTimeProviderRef = "auditingDateTimeProvider")
....

@Bean(name = "auditingDateTimeProvider")
public DateTimeProvider dateTimeProvider() {
        return () -> Optional.of(OffsetDateTime.now());
}

Без использования прослушивателя JPA Entity дата создания не будет работать, так как JPA работает для аудита и создания или изменения даты.

просто измените код, как показано ниже:

      @Entity
@EntityListeners(AuditingEntityListener.class)
class XYZ {

    @Setter(value = AccessLevel.NONE)
    @CreatedDate
    @Column(name = "date_time")
    private Date dateTime;


}

Добавьте @EnableMongoAuditing или @EnableJpaAuditing согласно вашему коду.

Другие вопросы по тегам