记录一次hibernate3.1 方言问题

错误:com.sun.proxy.$Proxy553 cannot be cast to java.lang.string      

我们项目上,将mysql数据库迁移到达梦数据库,这样会造成数据库类型上在java查询下,会有不兼容的问题,比如clob,text等,可能都有问题,这就需要用方言去解决了。

    之前text就出现了报错,找了半天也没能解决,后来改成了varchar(8000),虽然 改了不报错了,感觉可能会有隐患,只是项目上要的紧,只好先这样了。

  今天有个功能用到了colb,仍然报错,虽然错误的输出不一样,但是错误的根源是一样的,就是数据库字段和对应的hibernate解释的字段不匹配。

  据我分析,我需要将数据库对应的字段,映射到hibernate的string上,就可以展示了,可是问题来了,在网上找了很多,都是用这种去写的:

registerHibernateType(Types.DATE, Hibernate.TIMESTAMP.getName());//自定义数据类型

也行别的版本,这样写可能会成功,但是我用的hibernate3.1 根本不可以。

仍然会报错。

第一天就这样过去了,第二天就痛定思痛,只是找网上的资料不知道什么时候才能解决,我最后决定跟着源码走,思路很清晰,就是要找到映射这一块,看看为啥没有映射成功。

eclipse无法在jar包里面加断点,一上午渡过去,仍然没有找到具体位置。

下午的时候,决定用idea,虽然时间过去不少了,但是工欲善其事必先利其器,用idea可以在jar里面加断点去看源码,所以使用idea很快找到了关键点。

 protected void autoDiscoverTypes(ResultSet rs) {try {Metadata metadata = new Metadata(this.getFactory(), rs);List aliases = new ArrayList();List types = new ArrayList();this.rowProcessor.prepareForAutoDiscovery(metadata);for(int i = 0; i < this.rowProcessor.columnProcessors.length; ++i) {this.rowProcessor.columnProcessors[i].performDiscovery(metadata, types, aliases);}this.resultTypes = ArrayHelper.toTypeArray(types);this.transformerAliases = ArrayHelper.toStringArray(aliases);} catch (SQLException var6) {throw new HibernateException("Exception while trying to autodiscover types.", var6);}}

这个关键点找到了,在【performDiscovery】方法中,就是做映射的,为啥不成功,进去一看便知:

public class TypeNames {private Map<Integer, Map<Integer, String>> weighted = new HashMap();private Map<Integer, String> defaults = new HashMap();public TypeNames() {}public String get(int typecode) throws MappingException {String result = (String)this.defaults.get(typecode);if (result == null) {throw new MappingException("No Dialect mapping for JDBC type: " + typecode);} else {return result;}}

关键的方法就是在这里,TypeNames.get(),这个方法,获取方言配置类里面的映射,是取的TypeNames.default这个Map里面的数据,到这里问题就基本明确了。

切记,hibernate3.1的方言,数据类型的转换,一定是这个:

this.registerColumnType(Types.CLOB,StandardBasicTypes.STRING.getName());

如果需要把达梦其他数据类型转换为string,如果你不知道那个数据类型的int值,可以跟代码去查看,在类:

org.hibernate.loader.custom.CustomLoader 的方法autoDiscoverTypes中加上断点,查看对应的解决方案就可以了。

至此困扰我多次的这个方言问题解决了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179172.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习的线性回归与非线性回归

一元线性回归 回归分析用来建立方程模拟两个或者多个变量之间如何关联 一元线性回归包括一个自变量和一个因变量 如果包含两个以上的自变量&#xff0c;则称为多元线性回归 代价函数&#xff08;损失函数&#xff09; 损失函数的最终目的是为了使得误差平方和最小 用梯度下…

SDL2 播放音频(MP4)

1.简介 这里引入FFmpeg库&#xff0c;获取音频流数据&#xff0c;然后通过FFmpeg将视频流解码成pcm原始数据&#xff0c;再将pcm数据送入到SDL库中实现音频播放。 2.FFmpeg的操作流程 注册API&#xff1a;av_register_all()构建输入AVFormatContext上下文&#xff1a;avform…

01背包 D. Make Them Equal

Problem - D - Codeforces 输出值不超过k次操作后的最大值。 看b数组的大小&#xff0c;b数组元素是小于1000的正整数。从1到bi如果可以&#xff0c;那么最多是大概10次的&#xff0c;因为是指数递增的&#xff0c;例如&#xff1a;1 -> 2 -> 4 -> 8 -> 16 -> …

PostGIS学习教程七:关于几何图形的练习

文章目录 一、函数列表二、练习 一、函数列表 以下是我们迄今为止看到的所有函数的汇总&#xff0c;它们应该对练习有用&#xff01; sum(expression) aggregate to return a sum for a set of records count(expression) aggregate to return the size of a set of records …

微信群BUG大揭秘!开启身份切换神器

前言 最近微信群里出现了一个神秘的BUG&#xff0c;普通群成员竟然可以艾特全体成员。今天&#xff0c;就让我们一起揭秘这个令人震惊的微信群普通成员可全体成员的BUG 复现步骤 复现步骤也很简单&#xff0c;前提条件就是要在PC客户端操作&#xff01;首先得有个属于自己的群…

什么是自动化测试框架?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

Promise 重写 (第一部分)

学习关键语句&#xff1a; promise 重写 写在前面 重新学习了怎么重写 promise &#xff0c; 我觉得最重要的就是要有思路&#xff0c;不然有些 A 规范是完全想不到的 开始 重写函数的过程中, 最重要的是有思路 我们从哪里获取重写思路? 从正常的代码中 我们先看正常的代码…

windows 安装 Oracle Database 19c

目录 什么是 Oracle 数据库 下载 Oracle 数据库 解压文件 运行安装程序 测试连接 什么是 Oracle 数据库 Oracle数据库是由美国Oracle Corporation&#xff08;甲骨文公司&#xff09;开发和提供的一种关系型数据库管理系统&#xff0c;它是一种强大的关系型数据库管理系统…

HarmonyOS开发(二):TypeScript入门

1、编程语言介绍 ArkTS是HarmonyOS主推的应用开发语言&#xff0c;它是在TypeScript语言的基础之上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 ArkTS、TypeScript和JavaScript之间…

Radiology 谈人工智能在放射学领域的10个预测方向 [文献阅读]

人工智能(AI)和信息学正在改变放射学。十年前&#xff0c;没有哪个专家会预测到今天放射人工智能行业的蓬勃发展&#xff0c;100多家人工智能公司和近400种放射人工智能算法得到了美国食品和药物管理局(FDA)的批准。 不到一年前&#xff0c;即使是最精明的预言家也不会相信这些…

delete 与 truncate 命令的区别

直接去看原文 原文链接:【SQL】delete 与 truncate 命令的区别_truncate和delete的区别-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 1. 相同点 二者都能删除表中的数据…

CSRF 跨站请求伪造漏洞理解

1.漏洞描述 跨站请求伪造是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web应用程序上执行非本意的操作&#xff0c;攻击的重点在处于更改状态请求&#xff0c;而不是盗取数据&#xff0c;因为攻击者无法查看伪造请求的响应。 2.漏洞原理 攻击者可以…