2013-12-10 13 views
12

Sto lavorando al progetto in cui utilizzo Spring Data. Volevo compilare il campo creationTime utilizzando l'annotazione @CreatedDate utilizzando il metodo con l'annotazione @PreUpdate o @PrePersist (in questo modo funziona perfettamente). Quando lo faccio con @CreatedDate lascia questo campo vuoto. Io uso il database postgresql. Documentation non è molto utile.L'annotazione Spring Data @CreatedDate non funziona per me

Avete idea di come posso risolvere il problema? Grazie!

import org.springframework.data.annotation.CreatedDate; 
@Entity 
@Table(name = "software") 
public class Software implements Serializable { 

    // ... 

    @Column(name = "creation_time") 
    @CreatedDate 
    private Date creationTime; 
    //... 
} 

mio 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

Che cosa stai usando per mantenere l'entità? –

+0

Quello che voglio dire è che stai usando 'Session' o stai persistendo attraverso un servizio Spring Data? –

+0

Ho un'interfaccia 'SoftwareRespository' che estende' JpaRepository ' – alicjab

risposta

11

io sia stato in una situazione simile in cui ho voluto l'annotazione primavera dati JPA @CreatedDate a lavorare, ma non aveva bisogno per il livello di utente auditing che è altrimenti descritto nella loro documentazione.

Per ottenere il controllo basato sull'annotazione, dovevo comunque aggiungere una classe al mio progetto che implementava org.springframework.data.domain.AuditorAware. Questo è strano perché in realtà non sembra che si utilizzi il valore restituito dal metodo getCurrentAuditor() che verrà implementato; il mio restituisce semplicemente null.

public class NullAuditorBean implements AuditorAware { 

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

Ho quindi bisogno di fare riferimento a mio "oggetto nullo" AuditorAware implementazione in una voce nella mia applicationContext per attivare la revisione JPA. Dovevo assicurarmi di averlo fatto prima della riga che specifica lo jpa:repositories. Questo sembra qualcosa di simile:

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

ho anche dovuto aggiungere un file orm.xml, e aveva bisogno di fare riferimento formalmente come una proprietà della mia entityManagerFactory fagiolo, in questo modo:

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

Assicurarsi che questa voce META-INF/orm.xml viene memorizzato con l'output di compilazione (il mio è nella mia GUERRA sotto WEB-INF/classes.

Quel file orm.xml, per la cronologia, conteneva alcuni fogli di targa, che possono essere trovati nella risposta a this related question.

E 'stata una buona dose di lavoro quando ho funzionato. Potresti preferire la tua precedente soluzione di lavoro!

+0

Grazie! Mi ha aiutato. In futuro aggiungerò Spring Security al mio progetto e poi cambierò il mio NullAuditor in qualcosa di adatto. – alicjab

+0

orm.xml risolto il problema – cjungel

+3

Per la configurazione basata sull'annonazione. Puoi aggiungere @EnableJpaAuditing ("nullAuditorBean") – sanket1729

Problemi correlati