datetimeoffset hibernate mapping

后端 未结 2 1518
小蘑菇
小蘑菇 2020-12-19 15:29

I\'m trying to use hibernate with ms sql server and have difficulties mapping the sql type datetimeoffset to java. If I try to set the mapping type in the reverse engineerin

相关标签:
2条回答
  • 2020-12-19 16:07

    Your can provide a custom Hibernate user type. For example by implementing org.hibernate.type.MutableType.

    Refer Hibernate Reference for more information.

    0 讨论(0)
  • 2020-12-19 16:13

    An example custom type implementation for DatetimeOffset type can be seen below, on top of this you need to set the sql-type directive in the reverse engineering configuration file accordingly.

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

    The jdbc-type= -155 is for ms sql server datetimeoffset type.

    An example implementation:

    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();
        }
    }
    
    0 讨论(0)
提交回复
热议问题