@CreatedDate 注释不适用于 mysql
@CreatedDate annotation does not work with mysql
我是 spring 的新手,我对 @CreatedDate 注释在实体中的工作方式感到困惑。
我进行了 google 搜索,发现有很多解决方案,但其中 none 对我有用,只有一个除外。我很困惑为什么?
这是我首先尝试的
@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() {
}
这实际上将时间戳存储在数据库中。我的问题是我遵循的大部分教程都建议我不需要 new Date()
来获取当前时间戳。看起来我确实需要那个。我有什么想念的吗?
如果您只是将 @EntityListeners(AuditingEntityListener.class)
放在您的实体上,@CreatedDate
将无法单独工作。为了,它会工作你必须做更多的配置。
假设在你的数据库中 @CreatedDate
的字段是 String 类型,你想 return 当前登录的用户作为 @CreatedDate
的值,那么这样做:
public class CustomAuditorAware implements AuditorAware<String> {
@Override
public String getCurrentAuditor() {
String loggedName = SecurityContextHolder.getContext().getAuthentication().getName();
return loggedName;
}
}
您可以在那里编写满足您需要的任何功能,但您肯定必须有一个引用 class 的 bean,它实现了`AuditorAware
第二部分同样重要,是创建一个 return 带有 @EnableJpaAuditing
注释的 class 的 bean,如下所示:
@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());
}
您可以像这样使用@creationTimestamp 和@UpdateTimestamp:
@CreationTimestamp
private Instant createdAt;
@UpdateTimestamp
private Instant updatedAt;
如果不使用 JPA 实体侦听器,创建日期将不起作用,因为这是 JPA 用于审计和创建或修改日期的方式。
只需修改如下代码:
@Entity
@EntityListeners(AuditingEntityListener.class)
class XYZ {
@Setter(value = AccessLevel.NONE)
@CreatedDate
@Column(name = "date_time")
private Date dateTime;
}
我是 spring 的新手,我对 @CreatedDate 注释在实体中的工作方式感到困惑。
我进行了 google 搜索,发现有很多解决方案,但其中 none 对我有用,只有一个除外。我很困惑为什么?
这是我首先尝试的
@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() {
}
这实际上将时间戳存储在数据库中。我的问题是我遵循的大部分教程都建议我不需要 new Date()
来获取当前时间戳。看起来我确实需要那个。我有什么想念的吗?
如果您只是将 @EntityListeners(AuditingEntityListener.class)
放在您的实体上,@CreatedDate
将无法单独工作。为了,它会工作你必须做更多的配置。
假设在你的数据库中 @CreatedDate
的字段是 String 类型,你想 return 当前登录的用户作为 @CreatedDate
的值,那么这样做:
public class CustomAuditorAware implements AuditorAware<String> {
@Override
public String getCurrentAuditor() {
String loggedName = SecurityContextHolder.getContext().getAuthentication().getName();
return loggedName;
}
}
您可以在那里编写满足您需要的任何功能,但您肯定必须有一个引用 class 的 bean,它实现了`AuditorAware
第二部分同样重要,是创建一个 return 带有 @EnableJpaAuditing
注释的 class 的 bean,如下所示:
@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());
}
您可以像这样使用@creationTimestamp 和@UpdateTimestamp:
@CreationTimestamp
private Instant createdAt;
@UpdateTimestamp
private Instant updatedAt;
如果不使用 JPA 实体侦听器,创建日期将不起作用,因为这是 JPA 用于审计和创建或修改日期的方式。
只需修改如下代码:
@Entity
@EntityListeners(AuditingEntityListener.class)
class XYZ {
@Setter(value = AccessLevel.NONE)
@CreatedDate
@Column(name = "date_time")
private Date dateTime;
}