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.