我正在尝试将hibernate与ms sql server一起使用,但在将sql类型datetimeoffset映射到java时遇到了困难。如果我尝试在反向工程配置中使用以下命令设置映射类型:
我在说某事时出错。与org.hibernate.MappingException类似: jdbc- Type : microsoft.sql.Types.DATETIMEOFFSET既不是已知的JDBC类型,也不是有效的数字
我猜只有详细的jdbc类型才能在此上下文中使用。
对如何解决这个问题有什么想法吗?
发布于 2011-01-19 18:06:51
您可以提供自定义的Hibernate用户类型。例如,通过实现org.hibernate.type.MutableType。
有关更多信息,请参阅Hibernate Reference。
发布于 2011-01-20 17:53:10
下面是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();
}
}https://stackoverflow.com/questions/4733844
复制相似问题