在hibernate-4实体中,我使用推荐的DateTime映射joda时jadira用户类型属性。
@Entity
@Table(name="timing")
public class TimingEntity {
...
@Basic(optional=false)
@Column(name="moment")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...我的数据库是MySQL。将hibernate属性hbm2ddl.auto设置为create值后,在create表中生成以下列:
CREATE TABLE `timing` (
...
`moment` DATETIME NOT NULL,
...
)生成的CREATE TABLE包含DATETIME列。MySQL中的日期时间只有秒的精度,没有小数部分。为了使小数部分达到微秒,MySQL 5.6.4和更高的使 DATETIME(precision)列(例如DATETIME(3) )具有毫秒的精度。
我的问题是--有没有办法为用hbm2ddl生成的时态字段指定精度?至少,这是jadira,或者java.sql,或者jdbc驱动程序机器的问题吗?
P.S.当我手动修改DB表以获得我想要的准确的列精度时,比如说,DATETIME(3),一切正常-- joda DateTimes是以毫秒的精度从DB中写入和读取的。
发布于 2014-04-03 10:36:02
可以对其使用@Column#columnDefinition属性
@Basic(optional=false)
@Column(name="moment" columnDefinition="DATETIME(3) NOT NULL")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment()
{
...您也可以尝试使用@Column#precision属性,但是在文档中,这只适用于小数。
发布于 2014-04-03 19:13:06
我又找到了一个解决方案,允许在您的MySQL注释中不对@Column列定义片段进行硬编码。通过重写org.hibernate.dialect.MySQLDialect来定义您自己的hibernate方言
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 (没有小数秒),就不要指定长度。您可以使用高达6的length值,这意味着微秒的精度。
如果您碰巧使用了与上面的方言不同的方言(例如标准org.hibernate.dialect.MySQLDialect或其他数据库),这不会破坏您的代码:@Column上的length属性将被忽略。
在我自己的方言实现中,使用precision属性(而不是length )来代替"datetime($l)"模式可能会更明智,但是在我自己的方言实现中,用"datetime($p)" 1替换"datetime($l)"模式并不有效。
https://stackoverflow.com/questions/22785117
复制相似问题