Намерих още едно решение, което позволява да не се кодира твърдо фрагмент от дефиниция на колона на MySQL във вашия @Column
анотация. Дефинирайте своя собствен диалект за хибернация, като замените 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)" );
}
}
и го посочете като свойство hibernate hibernate.dialect=org.yourproject.MySQL564PlusDialect
(диалектът, който искате да разширите, може да варира, напр. org.hibernate.dialect.MySQL5InnoDBDialect
вместо това).
Сега можете да регулирате точността на вашия DATETIME
от @Column
анотация с помощта на length
атрибут:
@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
което ще произведе DATETIME(3)
дефиниция на колона, което означава точност в милисекунди. Ако имате нужда от простия DATETIME
(без частични секунди), просто не посочвайте дължина. Можете да използвате стойност на length
до 6, което би означавало микросекунди точност.
Ако случайно използвате диалект, различен от горния (например стандартния org.hibernate.dialect.MySQLDialect
или може би някаква друга база данни), която няма да наруши вашия код:length
атрибут на @Column
ще бъдат игнорирани.
P.S. Би било по-разумно да се използва precision
атрибут на @Column
вместо length
, но проста замяна на "datetime($l)"
шаблон с "datetime($p)"
един в моя собствен диалектна реализация не работи нарочно.