23

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

那没起效。我得到 NULLcreated列中的值。

然后我做了这个。

@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()获取当前时间戳。看来我确实需要那个。有什么我想念的吗?

4

5 回答 5

42

我也遇到了这个问题,你的解决方案帮助了我,谢谢,我添加了一些其他注释来工作

拳头确保您放入 SpringApplication 配置

@SpringBootApplication
@EnableJpaAuditing

其次,确保在需要的实体上使用此注释

  @Entity
  @Table
  @EntityListeners(AuditingEntityListener.class)
于 2019-07-03T15:34:37.590 回答
27

如果你只是穿上你的实体@CreatedDate,它本身是行不通的。@EntityListeners(AuditingEntityListener.class)为了,它会工作,你必须做更多的配置。

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

public class CustomAuditorAware implements AuditorAware<String> {

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

}

您可以在那里编写任何适合您需要的功能,但您当然必须有一个引用实现`AuditorAware 的类的bean

第二部分同样重要,是创建一个 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"/>
于 2016-11-02T02:25:29.127 回答
7

您可以像这样使用@creationTimestamp 和@UpdateTimestamp:

  @CreationTimestamp
  private Instant createdAt;

  @UpdateTimestamp
  private Instant updatedAt;
于 2021-10-19T11:54:38.357 回答
1

如果要使用 java8 时间类:

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

@Bean(name = "auditingDateTimeProvider")
public DateTimeProvider dateTimeProvider() {
        return () -> Optional.of(OffsetDateTime.now());
}
于 2021-07-17T10:39:58.280 回答
0

如果不使用 JPA 实体侦听器,创建日期将不起作用,因为这是 JPA 用于审计和创建或修改日期的方式。

只需修改如下代码:

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

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


}
于 2021-12-13T11:21:24.663 回答