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<Software, Long>
【参考方案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 审计注释