Java datetimeoffset休眠映射
我正在尝试将hibernate与ms sql server一起使用,但很难将sql类型datetimeoffset映射到java。 如果我尝试在反向工程配置中使用以下设置映射类型: 我说这样的话时出错了 org.hibernate.MappingException:jdbc类型:microsoft.sql.Types.DATETIMEOFFSET不是已知的jdbc类型,也不是有效的数字 我想只有detault jdbc类型可以在这种上下文中使用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用户类型。例如,通过实现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();
}
}