首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL日期时间精度(joda-time,Hibernate,org.jadira.usertype,hbm2ddl)

MySQL日期时间精度(joda-time,Hibernate,org.jadira.usertype,hbm2ddl)
EN

Stack Overflow用户
提问于 2014-04-01 11:54:29
回答 2查看 4.8K关注 0票数 5

在hibernate-4实体中,我使用推荐的DateTime映射joda时jadira用户类型属性。

代码语言:javascript
复制
@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表中生成以下列:

代码语言:javascript
复制
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中写入和读取的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 10:36:02

可以对其使用@Column#columnDefinition属性

代码语言:javascript
复制
@Basic(optional=false)
@Column(name="moment" columnDefinition="DATETIME(3) NOT NULL")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() 
{   
   ...

您也可以尝试使用@Column#precision属性,但是在文档中,这只适用于小数。

票数 3
EN

Stack Overflow用户

发布于 2014-04-03 19:13:06

我又找到了一个解决方案,允许在您的MySQL注释中不对@Column列定义片段进行硬编码。通过重写org.hibernate.dialect.MySQLDialect来定义您自己的hibernate方言

代码语言:javascript
复制
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的精度:

代码语言:javascript
复制
@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)"模式并不有效。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22785117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档