datetimeoffset hibernate mapping

我正在尝试使用ms sql server的hibernate,并且难以将sql类型datetimeoffset映射到java。 如果我尝试在逆向工程配置中设置映射类型:

我得到一个错误说…… 像org.hibernate.MappingException:jdbc-type:microsoft.sql.Types.DATETIMEOFFSET不是已知的JDBC Type也不是有效的数字

我想在这种情况下只能使用详细的jdbc类型。

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

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

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

下面可以看到DatetimeOffset类型的示例自定义类型实现,除此之外,您需要相应地在反向工程配置文件中设置sql-type指令。

   

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