首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >datetimeoffset hibernate映射

datetimeoffset hibernate映射
EN

Stack Overflow用户
提问于 2011-01-19 17:56:08
回答 2查看 4.7K关注 0票数 4

我正在尝试将hibernate与ms sql server一起使用,但在将sql类型datetimeoffset映射到java时遇到了困难。如果我尝试在反向工程配置中使用以下命令设置映射类型:

我在说某事时出错。与org.hibernate.MappingException类似: jdbc- Type : microsoft.sql.Types.DATETIMEOFFSET既不是已知的JDBC类型,也不是有效的数字

我猜只有详细的jdbc类型才能在此上下文中使用。

对如何解决这个问题有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2011-01-19 18:06:51

您可以提供自定义的Hibernate用户类型。例如,通过实现org.hibernate.type.MutableType。

有关更多信息,请参阅Hibernate Reference

票数 2
EN

Stack Overflow用户

发布于 2011-01-20 17:53:10

下面是DatetimeOffset类型的自定义类型实现示例,在此基础上,您需要在反向工程配置文件中相应地设置sql-type指令。

代码语言:javascript
复制
<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类型。

一个示例实现:

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4733844

复制
相关文章

相似问题

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