it-swarm.com.ru

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>

13
alicjab

Возможно, я был в подобной ситуации, когда хотел, чтобы аннотация 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, например, так:

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

Убедитесь, что эта запись META-INF/orm.xml хранится вместе с вашими результатами компиляции (моя находится в моей WAR под WEB-INF/classes.

Этот файл orm.xml, для записи, содержал некоторый шаблон, который можно найти в ответе на этот связанный вопрос .

Это было изрядное количество работы, когда я получил эту работу. Вы можете предпочесть свое предыдущее рабочее решение!

12
Tom Cross

Этот вопрос довольно старый, но все еще актуален. Для меня ключ был этот, из документация

Начиная с 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/>
0
Madbreaks