2014-04-01 2 views
4

, 나는 jadira usertypes 권장 사용하여 joda 시간을 DateTime 속성을 매핑하고 있습니다 :MySQL의 DATETIME 정밀도 (joda 시간, 최대 절전 모드, org.jadira.usertype, hbm2ddl을) 내 최대 절전 모드 - 4 개체에서

@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입니다.

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

생성 된 CREATE TABLE는 DATETIME 열을 포함하여 최대 절전 특성 hbm2ddl.auto 설정 값 create에로, 나는 나의 timing 테이블에서 생성 된 다음 열이. MySQL의 DATETIME은 분수 부분이없는 초 단위의 정밀도를 가지고 있습니다. 분수 부분 (최대 마이크로 초)을 활성화하려면 MySQL 5.6.4 이상 enablesDATETIME(precision) 열 (예 : DATETIME(3))이 밀리 초 단위의 정밀도를 가져야합니다.

내 질문은 - hbm2ddl로 생성 된 시간 필드에 대한 정밀도를 지정하는 방법이 있습니까? 적어도 이것은 jadira 사용자 유형 또는 java.sql 또는 jdbc 드라이버 기계의 문제입니까?

P. DB 테이블을 원하는 열의 정밀도 (예 : DATETIME(3))로 수동으로 수정하면 모든 것이 정상적으로 작동합니다. joda DateTimes는 밀리 초 정밀도로 DB에서 쓰여지고 읽혀집니다.

답변

2

사용은

@Basic(optional=false) 
@Column(name="moment" columnDefinition="DATETIME(3) NOT NULL") 
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
public DateTime getMoment() 
{ 
    ... 

또한 당신이 @Column#precision 속성을 시도 할 수 있습니다에 대한 @Column#columnDefinition 속성을 사용할 수 있지만, 문서에이 소수에 대해서만 작업 것으로 기록됩니다.

+0

트릭을 했어, 고마워! 'columnDefinition'이 효과가 있었고,'precision'은 작동하지 않았습니다. 그러나 단점은 내가 내 코드에서 mysql에 의존하기 시작한다는 것이다. –

5

@Column 주석에 MySQL 열 정의 스 니펫을 하드 코드 할 수없는 해결책이 하나 더 있습니다.

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.dialect=org.yourproject.MySQL564PlusDialect (대신, 예를 들어, org.hibernate.dialect.MySQL5InnoDBDialect 다를 수 있습니다 확장 할 수 있습니다 방언)로 지정 : org.hibernate.dialect.MySQLDialect를 재정 의하여 자신의 최대 절전 방언을 정의합니다.

이제 length 속성을 사용하여 @Column 주석 내에서 DATETIME의 정밀도를 조정할 수 있습니다 DATETIME(3) 열 정의의 의미 밀리 초 정밀도를 생성합니다

@Basic(optional=false) 
@Column(name="moment", length=3) 
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
public DateTime getMoment() { 
... 

합니다. DATETIME (초 단위는 아님)이 필요한 경우 길이를 지정하지 마십시오. 마이크로 초 정밀도를 의미하는 최대 값이 length 인 6을 사용할 수 있습니다. @Columnlength 속성이 무시됩니다

당신이 당신의 암호를 해독하지 않습니다 (예를 들어 표준 org.hibernate.dialect.MySQLDialect 또는 아마도 다른 데이터베이스) 위의 것과 다른 방언을 사용하는 일이 있다면

.

P. length 대신 precision 속성을 사용하는 것이 더 현명 할 것입니다. 그러나 "datetime($l)" 패턴을 "datetime($p)"으로 간단히 대체하는 것은 내 자신의 방언 구현에서 유용하지 않습니다.