2011-01-19 2 views
3

나는 ms SQL 서버에서 최대 절전 모드를 사용하려고하며 SQL 형식 datetimeoffset을 java에 매핑하는 데 어려움이 있습니다. 리버스 엔지니어링 구성에서 다음과 함께 매핑 유형을 설정하려고하면 : datetimeoffset 최대 절전 매핑

sth 오류가 발생합니다. org.hibernate.MappingException : jdbc 유형 : microsoft.sql.Types.DATETIMEOFFSET이 (가) 알려진 JDBC 유형 또는 유효한 숫자가 아닙니다.

이 경우에만 detault jdbc 유형을 사용할 수 있습니다.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

답변

2

사용자 정의 최대 절전 모드 사용자 유형을 제공 할 수 있습니다. 예를 들어 org.hibernate.type.MutableType을 구현함으로써.

자세한 내용은 Hibernate Reference을 참조하십시오.

1

DatetimeOffset 유형에 대한 예제 사용자 정의 유형 구현을 아래에서 볼 수 있습니다.위의 경우 이에 따라 리버스 엔지니어링 구성 파일에 sql-type 지시문을 설정해야합니다.

<type-mapping> 
<sql-type jdbc-type="-155" hibernate-type="package.x.y.z.DatetimeOffsetType"></sql-type> 
</type-mapping> 

jdbc-type = -155는 ms SQL Server datetimeoffset 유형입니다.

예제 구현 :

public class DatetimeOffsetType implements UserType { 

static { 
    initializeMethods(); 
} 

private static Method methodSetDateTimeOffset; 

@Override 
public Object assemble(Serializable arg0, Object arg1) 
     throws HibernateException { 
    return arg0; 
} 

@Override 
public Object deepCopy(Object value) throws HibernateException { 
    DateTimeOffset dateTimeOffset = (DateTimeOffset)value; 
    return (value == null) ? null : 
     DateTimeOffset.valueOf(dateTimeOffset.getTimestamp(), dateTimeOffset.getMinutesOffset()); 
} 

@Override 
public Serializable disassemble(Object arg0) throws HibernateException { 
    return (Serializable)arg0; 
} 

@Override 
public boolean equals(Object arg0, Object arg1) throws HibernateException { 
    if(arg0 == null || ! (arg0 instanceof DateTimeOffset) || arg1 == null || ! (arg1 instanceof DateTimeOffset)) { 
     return false; 
    } 

    return arg0.equals(arg1); 
} 

@Override 
public int hashCode(Object arg0) throws HibernateException { 
    return arg0.hashCode(); 
} 

@Override 
public boolean isMutable() { 
    return true; 
} 

@Override 
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) 
     throws HibernateException, SQLException { 
     return (DateTimeOffset) resultSet.getObject(names[0]); 
} 

@Override 
public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) 
     throws HibernateException, SQLException { 
    // TODO check casting 
    if(preparedStatement instanceof SQLServerPreparedStatement) { 
     SQLServerPreparedStatement sqlServerPreparedStatement = (SQLServerPreparedStatement)preparedStatement; 
     sqlServerPreparedStatement.setDateTimeOffset(index, (DateTimeOffset) value); 
    }else { 

     try { 
      C3P0ProxyStatement proxyStatement = (C3P0ProxyStatement)preparedStatement; 
      (proxyStatement).rawStatementOperation(methodSetDateTimeOffset,C3P0ProxyStatement.RAW_STATEMENT, new Object[] {index,(DateTimeOffset) value}); 
     } catch (Exception e) { 

     } 

    } 
} 

@Override 
public Object replace(Object original, Object target, Object arg2) 
     throws HibernateException { 
    // TODO Auto-generated method stub 
    System.out.println("replace"); 
    return null; 
} 

@Override 
public Class<DateTimeOffset> returnedClass() { 
    return DateTimeOffset.class; 
} 

@Override 
public int[] sqlTypes() { 
    return new int[] {microsoft.sql.Types.DATETIMEOFFSET}; //-155 
} 

private static void initializeMethods() { 
    try { 
     final Class c = Class.forName("com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement"); 
     methodSetDateTimeOffset = c.getMethod("setDateTimeOffset", new Class[] {Integer.TYPE,DateTimeOffset.class}); 
    } catch (Exception e) { 
     // TODO: handle exception 
     e.printStackTrace(); 
    } 
}