2011-12-12 16 views
26

¿Qué pasa si usamosAusencia de anotación @Temporal en hibernación

@Column(name="birth_date", nullable=false, length=19) 
public Date getBirthDate() { 
    return this.birthDate; 
} 

en lugar de

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="birth_date", nullable=false, length=19) 
public Date getBirthDate() { 
    return this.birthDate; 
} 

¿Hay efectos secundarios si utilizamos propiedad de la columna fecha sin @Temporal anotación?

+0

Añadiré a esta pregunta una comparación con f: convertDateTime ... Saludos. –

Respuesta

29

Sólo parte de la documentación que logró encontrar:

En Java APIs de fricción, el precisión temporal de tiempo no está definido. Al tratar con datos temporales, es posible que desee describir la precisión esperada en la base de datos. Los datos temporales pueden tener una precisión de DATE, TIME o TIMESTAMP (es decir, la fecha real, solo la hora o ambas). Usa la anotación @Temporal para afinar eso.

De 2.2.2.1. Declaring basic property mappings.

podría indicar que la representación de fecha real en la base de datos no está definida y para asegurarse de que es mejor especificarlo directamente.

+3

+1 - Tampoco encontré ningún fragmento más que pudiera hablar sobre lo que Hibernate haría si no se especifica '@ Temporal'. Solo como una adición: EclipseLink ni siquiera le permite ** no ** definir la precisión temporal. Preferiría definir la precisión exacta que esperas tener. –

22

Me doy cuenta de que esta pregunta ya fue respondida, pero tuvimos problemas con esto hoy, así que quería dar más información para las personas que se topen con esto en el futuro.

Usando Oracle 11g con los controladores de la versión 11 si no utiliza la anotación temporal, cada tipo de datos de fecha y hora de Oracle se correlacionará con una marca de tiempo en su código en tiempo de ejecución. Funcionalmente, esto está bien, sin embargo, esto nos causó graves problemas de rendimiento. Esto se debía a que teníamos un tipo de DATE como parte de una clave primaria compuesta. Esta columna fue la columna principal del índice, así como la columna que utilizamos para la partición. Cuando el controlador intente persistir registros con esta columna en la cláusula where, Oracle realizará una conversión de tipo de los datos en el DB de DATE a TIMESTAMP. Esto hizo que el índice fuera inútil y el rendimiento fue horrible.

Larga historia, agregue esta anotación siempre que no esté preparado para pagar el precio.

+0

+1 como respuesta :) –

+0

Buena explicación con ejemplos de tiempo real. TY! – Diablo

Cuestiones relacionadas