2009-11-12 11 views
17

grazie a voi ragazzi la mia conoscenza su ibernazione è stata migliorata dratiscalmente. ora ho colpito un blocco qui su current_timestamp. ecco la mia codicitempo difficile impostazione del tempo generato automaticamente con le annotazioni JPA in letargo

@Column(name="DATE_CREATED", insertable=false, updatable=false, columnDefinition="timestamp default current_timestamp") 
@org.hibernate.annotations.Generated(value=GenerationTime.INSERT) 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
private Date dateCreated; 

@Column(name="LAST_MODIFIED", insertable=false, updatable=false, columnDefinition="datetime") 
@org.hibernate.annotations.Generated(value=GenerationTime.ALWAYS) 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
private Date lastModified; 

voglio date_created per ottenere il CURRENT_TIMESTAMP e voglio il LastModified per inserire il tempo per ogni updates.apparently non posso avere 2 campi CURRENT_TIMESTAMP sugli stessi table.Is Ci sono altri modi per raggiungere questo? grazie per aver letto

risposta

47

Questo non è correlato a Hibernate di per sé. Le annotazioni come sopra specificate indicano che i valori verranno generati dal database e che quindi devono essere ricaricati dopo l'inserimento/l'aggiornamento dell'entità.

Se questo è il modo in cui si vuole andare, è necessario configurare il database (creando un trigger, ad esempio) per popolare le colonne date_created/last_modified secondo necessità.

Un altro approccio consiste nel non contrassegnare quei campi come generati e invece aggiornarli nel codice java. Se stai usando JPA (tramite Hibernate EntityManager), è piuttosto banale per fare questo via @PrePersist/@PreUpdate metodo di callback:

@PreUpdate 
@PrePersist 
public void updateTimeStamps() { 
    lastModified = new Date(); 
    if (dateCreated==null) { 
     dateCreated = new Date(); 
    } 
} 
+0

@ ChssPly76: perché non può avere 2 current_timestamps nella stessa tabella, non lo so questa è una limitazione di Hibernate e dalla tua risposta non la pensi neanche tu. Quindi deve essere una limitazione di business/dba (anche se il suo uso di "apparentemente non posso ..." sembra che sia stato sorpreso da quell'epifania), e se lui non può usare EM allora quale potrebbe essere il suo ricorso. –

+0

Hibernate non si preoccupa; è una limitazione del database - MySQL per essere precisi. Non ho idea del perché non lo permettano; forse perché pensavano che quei timestamp sarebbero sempre stati gli stessi. – ChssPly76

+1

Per ms sql server, timestamp significa qualcosa di completamente diverso da datetime e non ha senso avere più. – ashirley

Problemi correlati