2014-04-01 94 views
4

在我休眠-4的實體,我使用的是推薦jadira usertypes映射喬達時間DateTime屬性:MySQL的DATETIME精度(喬達時間,休眠,org.jadira.usertype和hbm2ddl)

@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價值,我有我的timing表中生成以下列:

CREATE TABLE `timing` (
    ... 
    `moment` DATETIME NOT NULL, 
    ... 
) 

生成CREATE TABLE包含DATETIME列。 MySQL中的DATETIME只有幾秒精度,沒有小數部分。爲了啓用小數部分,高達微秒,MySQL 5.6.4和更高版本enablesDATETIME(precision)列,例如DATETIME(3)具有毫秒精度。

我的問題是 - 是否有方法來指定我的時間字段與hbm2ddl生成的精度?至少,這是jadira usertypes還是java.sql或jdbc驅動程序的問題?

P.S.當我手動修改數據庫表以獲得精確的列精度(例如DATETIME(3))時,一切正常 - joda DateTimes以毫秒級的精度從數據庫中讀取和讀取。

回答

2

使用可以使用@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財產,但在文件被寫入,這只是工作小數。

+0

它做到了,謝謝! 'columnDefinition'確實起作用,'精確'沒有。但缺點是我開始依賴於我的代碼中的MySQL。 –

5

我發現了另外一個解決方案,它允許在您的@Column註釋中不對硬編碼MySQL列定義片段進行硬編碼。通過覆蓋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而不是方言)。現在

您可以通過使用length屬性從@Column註釋中調整DATETIME精度:

@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或者一些其他數據庫)不同的方言,不會破壞你的代碼:上@Columnlength屬性將被忽略。

P.S.使用@Column而不是length來代替precision屬性會更合理,但是在我自己的方言實現中,一個簡單的"datetime($l)"模式替換爲"datetime($p)"並不適用。