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.