Spring Data @CreatedDate annotation doesn't work for me

java, jpa, postgresql, spring, spring-mvc

Solution

I may have been in a similar situation where I wanted the Spring Data JPA `@CreatedDate` annotation to work, but had no need for the user-level auditing that is otherwise described in their documentation.

To get the annotation-based auditing to work, I had to nonetheless add a class to my project that implemented `org.springframework.data.domain.AuditorAware`. This is odd because you don't actually seem to use the value returned from the `getCurrentAuditor()` method that you'll be implementing; mine just returns `null`.

public class NullAuditorBean implements AuditorAware {

    @Override
    public Object getCurrentAuditor() {
        return null;
    }
}

I then needed to reference my "null object" `AuditorAware` implementation in an entry in my `applicationContext` to activate the JPA auditing. I had to make sure I did this before the line that specifies the `jpa:repositories`. This looks something like:

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

I also had to add an `orm.xml` file, and needed to formally reference it as a property of my `entityManagerFactory` bean, like so:

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

Make sure this `META-INF/orm.xml` entry is stored with your compile output (mine is in my WAR under `WEB-INF/classes`.

That `orm.xml` file, for the record, contained some boilerplate, which can be found in the answer to this related question.

It was a fair amount of work when I got this working. You may prefer your previous working solution!

Problem

I am working on project where I use Spring Data. I wanted to fill in `creationTime` field using `@CreatedDate` annotation instead using method with `@PreUpdate` or `@PrePersist` annotation (doing it this way it works perfectly). When I do it with `@CreatedDate` it just leaves this field blank. I use postgresql database. Documentation is not very helpful. Do you have any idea how can I fix it? Thank you! ``` import org.springframework.data.annotation.CreatedDate; @Entity @Table(name = "software") public class Software implements Serializable { // ... @Column(name = "creation_time") @CreatedDate private Date creationTime; //... } ``` My `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> ```

Original source