sql >> Base de Datos >  >> RDS >> Mysql

Precisión MySQL DATETIME (joda-time, Hibernate, org.jadira.usertype, hbm2ddl)

Encontré una solución más que permite no codificar el fragmento de definición de columna de MySQL en su @Column anotación. Defina su propio dialecto de hibernación anulando org.hibernate.dialect.MySQLDialect :

package org.yourproject;

import java.sql.Types;
import org.hibernate.dialect.MySQL5Dialect;

public class MySQL564PlusDialect extends MySQL5Dialect {
   public MySQL564PlusDialect() {
      super();
      registerColumnType( Types.TIMESTAMP, 6, "datetime($l)" );
   }
}

y especifíquelo como propiedad de hibernación hibernate.dialect=org.yourproject.MySQL564PlusDialect (el dialecto que querrá extender puede variar, por ejemplo, org.hibernate.dialect.MySQL5InnoDBDialect en su lugar).

Ahora puede ajustar la precisión de su DATETIME desde dentro de @Column anotación usando length atributo:

@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
 ...

que producirá DATETIME(3) definición de columna que significa precisión de milisegundos. Si necesita el simple DATETIME (sin segundos fraccionarios), simplemente no especifique la duración. Puede usar el valor de length hasta 6, lo que significaría una precisión de microsegundos.

Si usa un dialecto diferente al anterior (por ejemplo, el estándar org.hibernate.dialect.MySQLDialect o tal vez alguna otra base de datos), eso no romperá su código:la length atributo en @Column serán ignorados.

PD Sería más sensato explotar la precision atributo de @Column en lugar de length , pero simple reemplazo de "datetime($l)" patrón con "datetime($p)" uno en mi propia implementación de dialecto no funciona de inmediato.