【问题标题】:datetimeoffset hibernate mappingdatetimeoffset 休眠映射
【发布时间】:2011-06-11 15:43:32
【问题描述】:

我正在尝试将休眠与 ms sql server 一起使用,并且在将 sql 类型 datetimeoffset 映射到 java 时遇到了困难。 如果我尝试在逆向工程配置中设置映射类型:

我收到一条错误消息。喜欢 org.hibernate.MappingException: jdbc-type: microsoft.sql.Types.DATETIMEOFFSET 不是已知的 JDBC 类型也不是有效数字

我猜在这种情况下只能使用 detault jdbc 类型。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: java sql-server hibernate datetime datetimeoffset


    【解决方案1】:

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

    更多信息请参考Hibernate Reference

    【讨论】:

      【解决方案2】:

      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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 2014-12-27
        • 2021-02-02
        相关资源
        最近更新 更多