@CreatedDate注释不适用于mysql

时间:2016-11-02 00:37:41

标签: java mysql spring-boot spring-data-jpa audit-tables

我是Spring的新手,我对@CreatedDate注释在实体中的工作方式感到困惑。

我进行了谷歌搜索并且有许多解决方案,但除了一个之外,它们都没有为我工作。我很困惑为什么?

这是我先试过的

@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() {
    }

它不起作用。我为created列中的值获取了NULL。

然后我做了这个。

@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() {
    }

这实际上将时间戳存储在db中。我的问题是我遵循的大多数教程都表明我不需要new Date()来获取当前时间戳。看起来我确实需要它。有什么我想念的吗?

3 个答案:

答案 0 :(得分:9)

如果只是将@CreatedDate放在您的实体上,@EntityListeners(AuditingEntityListener.class)将无法自行运行。按顺序,你需要做一些配置。

假设您的数据库中@CreatedDate的字段是字符串类型,并且您希望将当前登录的用户作为@CreatedDate的值返回,然后执行以下操作:

public class CustomAuditorAware implements AuditorAware<String> {

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

}

你可以在那里写任何符合你需要的功能,但是你当然必须有一个bean来引用一个实现`AuditorAware

的类。

第二部分同样重要的是创建一个bean,它返回带注释为@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"/>

答案 1 :(得分:0)

我也遇到了这个问题,您的解决方案对我有所帮助,谢谢,并且我添加了一些其他注释以供使用

首先请确保您输入了SpringApplication Configuration

@SpringBootApplication
@EnableJpaAuditing

第二,确保在所需的实体上使用此注释

  @Entity
  @Table
  @EntityListeners(AuditingEntityListener.class)

答案 2 :(得分:0)

如果你想使用java8时间类:

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

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