我正在开发使用Spring Data的项目。我想使用creationTime
注释来填充@CreatedDate
字段,而不是使用带有@PreUpdate
或@PrePersist
注释的方法(以这种方式完美地运行)。当我使用@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>
答案 0 :(得分:12)
我可能遇到类似的情况,我希望Spring Data JPA @CreatedDate
注释能够正常工作,但不需要在文档中另外描述的用户级审计。
要使基于注释的审核工作,我必须在我的项目中添加一个实现org.springframework.data.domain.AuditorAware
的类。这很奇怪,因为您实际上似乎并没有使用您将要实现的getCurrentAuditor()
方法返回的值;我只返回null
。
public class NullAuditorBean implements AuditorAware {
@Override
public Object getCurrentAuditor() {
return null;
}
}
然后,我需要在AuditorAware
的条目中引用我的“空对象”applicationContext
实现来激活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的答案中找到。
当我开始工作时,这是相当多的工作。您可能更喜欢以前的工作解决方案!
答案 1 :(得分:0)
这个问题已经很老了,但是仍然很重要。对我来说,关键是从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/>