Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Precisão do MySQL DATETIME (joda-time, Hibernate, org.jadira.usertype, hbm2ddl)


Encontrei mais uma solução que permite não codificar o trecho de definição de coluna MySQL em seu @Column anotação. Defina seu próprio dialeto de hibernação substituindo 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)" );
   }
}

e especifique-a como propriedade de hibernação hibernate.dialect=org.yourproject.MySQL564PlusDialect (o dialeto que você deseja estender pode variar, por exemplo, org.hibernate.dialect.MySQL5InnoDBDialect em vez de).

Agora você pode ajustar a precisão do seu DATETIME de dentro de @Column anotação usando length atributo:
@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
 ...

que produzirá DATETIME(3) definição de coluna que significa precisão de milissegundos. Se você precisar do simples DATETIME (sem segundos fracionários), apenas não especifique o comprimento. Você pode usar o valor de length até 6, o que significaria precisão de microssegundos.

Se você usar um dialeto diferente do acima (por exemplo, o padrão org.hibernate.dialect.MySQLDialect ou talvez algum outro banco de dados), que não quebrará seu código:o length atributo em @Column será ignorado.

P.S. Seria mais sensato explorar a precision atributo de @Column em vez de length , mas simples substituição de "datetime($l)" padrão com "datetime($p)" um em minha própria implementação de dialeto não funciona de improviso.