Spring Data @CreatedDate 注释对我不起作用

Posted

技术标签:

【中文标题】Spring Data @CreatedDate 注释对我不起作用【英文标题】:Spring Data @CreatedDate annotation doesn't work for me 【发布时间】:2013-12-27 08:13:17 【问题描述】:

我正在开发使用 Spring Data 的项目。我想使用@CreatedDate 注释而不是使用带有@PreUpdate@PrePersist 注释的方法来填充creationTime 字段(这样做可以完美地工作)。当我使用@CreatedDate 执行此操作时,它只会将此字段留空。我使用 postgresql 数据库。 Documentation 不是很有帮助。

您知道我该如何解决吗?谢谢!

import org.springframework.data.annotation.CreatedDate;
@Entity
@Table(name = "software")
public class Software implements Serializable 

    // ...

    @Column(name = "creation_time")
    @CreatedDate
    private Date creationTime;
    //...

我的applicationContext

<jpa:repositories base-package="path.to.dao"/>


<context:component-scan base-package="path.to.dao"/>
<context:property-placeholder location="classpath:application.properties"/>


<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="$db.driver"/>
    <property name="url" value="$db.url"/>
    <property name="username" value="$db.username"/>
    <property name="password" value="$db.password"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="path.to.bean"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="jpaAdapter"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">$hibernate.dialect</prop>
            <prop key="hibernate.show_sql">$hibernate.show_sql</prop>
            <prop key="hibernate.format_sql">$hibernate.format_sql</prop>
            <prop key="hibernate.ejb.naming_strategy">$hibernate.ejb.naming_strategy</prop>
            <prop key="hibernate.hbm2ddl.auto">$hibernate.hbm2ddl.auto</prop>
        </props>
    </property>
</bean>

<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

【问题讨论】:

你用什么来持久化实体? 我的意思是您是直接使用Session 还是通过 Spring Data 服务持久化? 我有一个接口SoftwareRespository,它扩展了JpaRepository&lt;Software, Long&gt; 【参考方案1】:

我可能遇到过类似的情况,我希望 Spring Data JPA @CreatedDate 注释能够工作,但不需要他们文档中另外描述的用户级审计。

为了使基于注释的审计工作,我仍然必须在我的项目中添加一个实现org.springframework.data.domain.AuditorAware 的类。这很奇怪,因为您实际上似乎并没有使用您将要实现的 getCurrentAuditor() 方法返回的值;我的只是返回null

public class NullAuditorBean implements AuditorAware 

    @Override
    public Object getCurrentAuditor() 
        return null;
    

然后我需要在我的applicationContext 的条目中引用我的“空对象”AuditorAware 实现以激活 JPA 审计。我必须确保在指定jpa:repositories 的行之前执行此操作。这看起来像:

<bean id="auditorBean" class="your.package.subbed.here.NullAuditorBean"/>
<jpa:auditing auditor-aware-ref="auditorBean"/>

我还必须添加一个orm.xml 文件,并且需要将它正式引用为我的entityManagerFactory bean 的属性,如下所示:

<property name="mappingResources">
    <value>META-INF/orm.xml</value>
</property>

确保此META-INF/orm.xml 条目与您的编译输出一起存储(我的位于WEB-INF/classes 下的WAR 中。

orm.xml 文件,作为记录,包含一些样板,可以在this related question 的答案中找到。

当我得到这个工作时,这是相当多的工作。您可能更喜欢以前的工作解决方案!

【讨论】:

谢谢!它帮助了我。将来我将把 Spring Security 添加到我的项目中,然后我会将我的 NullAuditor 更改为合适的。 orm.xml 解决了我的问题 用于基于 annonation 的配置。您可以添加@EnableJpaAuditing("nullAuditorBean")【参考方案2】:

这个问题已经很老了,但仍然很重要。对我来说,关键是这个,来自the documentation

由于 Spring Data MongoDB 1.4 审计可以通过使用 @EnableMongoAuditing 注释注释配置类来启用。

例如:

@Configuration
@EnableMongoAuditing
class Config 

  /**
   * Optional, depending on your needs
   */
  @Bean
  public AuditorAware<AuditableUser> myAuditorProvider() 
      return new AuditorAwareImpl();
  

或者,在 XML 中:

<mongo:auditing/>

【讨论】:

以上是关于Spring Data @CreatedDate 注释对我不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data MongoDB - 使用自定义 Id 字段时注释 @CreatedDate 不起作用

Spring Data MongoDB - 使用自定义 Id 字段时注释 @CreatedDate 不起作用

简单的 Spring @CreatedDate 注释对我不起作用

使用带有 @Embeddable 类的 Spring Data 审计注释

保存对象时未填充 Spring Boot JPA@CreatedDate @LastModifiedDate

spring-data-mongo - 可选查询参数?