2011-11-01 141 views
26

Todas mis tablas db deben tener un campo endTime que de forma predeterminada debe ser END_OF_TIME o algo así. No estoy contento con la limitación 2038, así que quiero que endTime sea del tipo DATETIME en mysql.¿Cómo puedo mapear una fecha de Java a DATETIME en mysql (de forma predeterminada es TIMESTAMP) con anotaciones de Hibernate

código

Mi Java es:

@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() { 
} 

} 

que puede evitar mediante la creación de la tabla de forma manual con un campo endTime de tipo DATETIME, y que mapear la entidad endTime a esa columna, sin embargo me gustaría Hibernate para generar las tablas de forma automática, ¿cómo puedo hacer eso?

Respuesta

56

utilizar el atributo columnDefinition del @Column annotation:

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

Y por favor, haga sus atributos privado.

+2

que funciona! ¿Por qué todavía es necesario utilizar la anotación @Temporal? Parece que no tiene ningún efecto adicional. – user1023622

+8

Sí lo es. La anotación @Temporal le dice a Hibernate si debe usar java.sql.Date o java.sql.Timestamp para almacenar la fecha leída de la base de datos. Ambos amplían la clase java.util.Date, pero java.sql.Date no contiene ninguna información de tiempo: solo la fecha. –

+7

+1 por "por favor, haga que sus atributos sean privados" – 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 
} 

encontré que el TemporalType.TIMESTAMP es java.sql.Timestamp

Cuestiones relacionadas