Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java datetimeoffset休眠映射_Java_Sql Server_Hibernate_Datetime_Datetimeoffset - Fatal编程技术网

Java datetimeoffset休眠映射

Java datetimeoffset休眠映射,java,sql-server,hibernate,datetime,datetimeoffset,Java,Sql Server,Hibernate,Datetime,Datetimeoffset,我正在尝试将hibernate与ms sql server一起使用,但很难将sql类型datetimeoffset映射到java。 如果我尝试在反向工程配置中使用以下设置映射类型: 我说这样的话时出错了 org.hibernate.MappingException:jdbc类型:microsoft.sql.Types.DATETIMEOFFSET不是已知的jdbc类型,也不是有效的数字 我想只有detault jdbc类型可以在这种上下文中使用 有关如何解决此问题的任何想法?您可以提供自定义的

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

我说这样的话时出错了 org.hibernate.MappingException:jdbc类型:microsoft.sql.Types.DATETIMEOFFSET不是已知的jdbc类型,也不是有效的数字

我想只有detault jdbc类型可以在这种上下文中使用


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

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


有关更多信息,请参阅。

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

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

jdbc类型=-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();
    }
}
公共类DatetimeOffsetType实现UserType{
静止的{
初始化方法();
}
私有静态方法methodSetDateTimeOffset;
@凌驾
公共对象汇编(可序列化arg0,对象arg1)
抛出冬眠异常{
返回arg0;
}
@凌驾
公共对象deepCopy(对象值)引发HibernateException{
DateTimeOffset DateTimeOffset=(DateTimeOffset)值;
返回值(值==null)?null:
DateTimeOffset.valueOf(DateTimeOffset.getTimestamp(),DateTimeOffset.getMinutesOffset());
}
@凌驾
公共可序列化反汇编(对象arg0)引发HibernateException{
返回(可序列化)arg0;
}
@凌驾
公共布尔等于(对象arg0,对象arg1)引发HibernateException{
如果(arg0==null | | |!(arg0实例of DateTimeOffset)| | arg1==null | |!(arg1实例of DateTimeOffset)){
返回false;
}
返回arg0.equals(arg1);
}
@凌驾
public int hashCode(对象arg0)引发HibernateeException{
返回arg0.hashCode();
}
@凌驾
公共布尔可交换(){
返回true;
}
@凌驾
公共对象nullSafeGet(ResultSet ResultSet,字符串[]名称,对象所有者)
抛出HibernateeException、SQLException{
return(DateTimeOffset)resultSet.getObject(名称[0]);
}
@凌驾
public void nullSafeSet(PreparedStatement PreparedStatement,对象值,int索引)
抛出HibernateeException、SQLException{
//待办事项检查铸件
if(SQLServerPreparedStatement的preparedStatement实例){
SQLServerPreparedStatement SQLServerPreparedStatement=(SQLServerPreparedStatement)preparedStatement;
sqlServerPreparedStatement.setDateTimeOffset(索引,(DateTimeOffset)值);
}否则{
试一试{
C3P0ProxyStatement proxyStatement=(C3P0ProxyStatement)preparedStatement;
rawStatementOperation(methodSetDateTimeOffset,C3P0ProxyStatement.RAW_语句,新对象[]{index,(DateTimeOffset)值});
}捕获(例外e){
}
}
}
@凌驾
公共对象替换(对象原始、对象目标、对象arg2)
抛出冬眠异常{
//TODO自动生成的方法存根
系统输出打印项次(“替换”);
返回null;
}
@凌驾
公共类returnedClass(){
返回日期timeoffset.class;
}
@凌驾
公共int[]sqlTypes(){
返回新的int[]{microsoft.sql.Types.DATETIMEOFFSET};//-155
}
私有静态void initializeMethods(){
试一试{
最终类c=Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement”);
methodSetDateTimeOffset=c.getMethod(“setDateTimeOffset”,新类[]{Integer.TYPE,DateTimeOffset.Class});
}捕获(例外e){
//TODO:处理异常
e、 printStackTrace();
}
}