@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)
Если вы хотите использовать классы времени 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 согласно вашему коду.