我发现了另一种解决方案,该解决方案允许不在您的数据库中对 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
将被忽略。
附:更明智的做法是利用precision
的属性@Column
代替length
,但简单替换"datetime($l)"
图案与"datetime($p)"
用我自己的方言实现的一个方法不能立即工作。