Spring Аннотации Data @CreatedDate для меня не работают
Я работаю над проектом, где я использую Spring Data. Я хотел заполнить поле creationTime
, используя аннотацию @CreatedDate
, вместо этого используя метод с аннотацией @PreUpdate
или @PrePersist
(при этом он отлично работает). Когда я делаю это с помощью @CreatedDate
, он просто оставляет это поле пустым. Я использую базу данных postgresql. Документация не очень полезна.
У вас есть идеи, как я могу это исправить? Спасибо!
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>
Ответы
Ответ 1
Возможно, я был в аналогичной ситуации, когда я хотел, чтобы аннотация Spring JPA @CreatedDate
работала, но не нуждалась в аудите на уровне пользователя, который иначе описан в их документации.
Чтобы получить аудит на основе аннотаций, я должен был добавить класс к моему проекту, который реализовал org.springframework.data.domain.AuditorAware
. Это странно, потому что вы фактически не используете значение, возвращаемое из метода getCurrentAuditor()
, который вы будете внедрять; my просто возвращает 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
хранится с вашим компиляционным выходом (мой находится в моей WAR под WEB-INF/classes
.
В этом файле orm.xml
для записи содержится некоторый шаблонный шаблон, который можно найти в ответе этого связанного вопроса.
Это была большая работа, когда я получил эту работу. Вы можете предпочесть свое предыдущее рабочее решение!