2011-11-01 5 views
26

Tutte le mie tabelle db dovrebbero avere un campo endTime che per impostazione predefinita dovrebbe essere END_OF_TIME o qualcosa del genere. Non sono contento della limitazione del 2038, quindi voglio che endTime sia di tipo DATETIME in mysql.Come posso mappare una data Java a DATETIME in mysql (per impostazione predefinita il suo TIMESTAMP) con annotazioni Hibernate

codice

mio Java è:

@MappedSuperclass 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class BaseDBEntity { 
@Id 
@Column(length=36) 
public String id; 

@Temporal(TemporalType.TIMESTAMP) 
public Date startTime; 

@Temporal(TemporalType.TIMESTAMP) 
public Date endTime; 

public BaseDBEntity() { 
} 

} 

posso aggirare creando manualmente la tabella con un campo endTime di tipo DATETIME, e di mappare l'entità endTime a quella colonna, però vorrei Hibernate per generare le tabelle automaticamente - come posso farlo?

risposta

56

utilizzare l'attributo columnDefinition del @Column annotation:

@Column(name = "startTime", columnDefinition="DATETIME") 
@Temporal(TemporalType.TIMESTAMP) 
private Date startTime; 

E, per favore, fate la vostra attributi privato.

+2

che funziona! Perché è ancora necessario utilizzare l'annotazione @Temporal? Sembra che non abbia alcun effetto aggiuntivo. – user1023622

+8

Sì, lo è. L'annotazione @Temporal indica a Hibernate se deve utilizzare un java.sql.Date o un java.sql.Timestamp per memorizzare la data letta dal database. Entrambi estendono la classe java.util.Date, ma java.sql.Date non contiene alcuna informazione sull'ora: solo la data. –

+7

+1 per "per favore, rendi privati ​​i tuoi attributi" – scravy

-3
public enum TemporalType { 
    /** 
    * Map as <code>java.sql.Date</code> 
    */ 
    DATE, 

    /** 
    * Map as <code>java.sql.Time</code> 
    */ 
    TIME, 

    /** 
    * Map as <code>java.sql.Timestamp</code> 
    */ 
    TIMESTAMP 
} 

ho scoperto che il TemporalType.TIMESTAMP è java.sql.Timestamp

Problemi correlati