`
rain_2372
  • 浏览: 687990 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate spring 读存取 blob 86字节

阅读更多
数据库:oracle11g

JDK版本:JDK1.5

框架:Struts2、Hibernate、Spring



开发过程中遇到了一个问题,数据库的BLOB字段该与POJO类字段的什么类型映射?Hibernate可以像操作其他对象一样操作BLOB字段对应的Java数据类型。



初次的映射方法为:数据库BLOB与java.sql.Blob类型映射(大家都知道Oracle9i和其他数据库存取BLOB的方式不一样,而且Oracle9i和Oracle10g都不兼容),如果使用这种映射方式,用Hibernate的saveOrUpdate()是没有办法将图片存到数据库中的。

    于是在网上搜索解决方法,经过大量的筛选,终于找到了方法,具体做法如下:

(1)数据库类型:BLOB

     配置hibernate的持久类文件中对应的字段为byte[]类型

     配置hibernate的类映射文件中对应的字段type为     org.springframework.orm.hibernate3.support.BlobByteArrayType
    -----------------------------------------

    数据库类型:CLOB

    配置hibernate的持久类文件中对应的字段为String类型

    配置hibernate的类映射文件中对应的字段type为     org.springframework.orm.hibernate3.support.CloBStringType



(2)在sessionFactory中加入lobHandler的注射:

<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="lobHandler" ref="lobHandler"/>
        <property name="mappingResources">
                  <value>xxx.hbm.xml</value>
                  .....
         </property>
</bean>

(3)定义这个lobHandler,值得注意的是这里有Oracle的版本区别:

<bean id="lobHandler" lazy-init="true"   class="org.springframework.jdbc.support.lob.OracleLobHandler">
        <property name="nativeJdbcExtractor">
            <ref bean="nativeJdbcExtractor"/>
        </property>
</bean>

<bean id="nativeJdbcExtractor" lazy-init="true"   class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>

spring有几个实现类,根据不同的连接池类型,选择不同的实现类:

因为Oracle9i处理Blob和Clob的方式和别的数据库很不一样,甚至与Oracle10g都不兼容,所以这里要用spring提供的SimpleNativeJdbcExtractor.如果使用Oracle10g或Oracle11g的话,可以直接使用:

<bean id="lobHandler" lazy-init="true"  class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>



这里需要说明的是:如果使用Oracle10g或Oracle11g,用上述定义的bean就不需要在定义nativeJdbcExtractor这个bean了,我第一次用的时候,犯了一个错误,在Oracle9i中用的bean的基础上就直接把bean中的class改了改,结果报了一大堆的异常,就是因为Oracle10g或Oracle11g中读存BLOB的lobHandler的bean的已经不需要nativeJdbcExtractor这个属性了,希望大家不要弄错了。



经过上述的步骤,我可以将图片资源存入到Oracle11g中了,但是读取的时候byte[]长度不管在数据库存的图片的真实字节数是多少,它读出来的长度都是86,很是郁闷,后来去网上搜资料,百度就不用说了,就没有相关的信息,在谷歌里还有点相关的信息,不过也都是说Oracle10g或Oracle9i的,关于Oracle11g根本没有呀,hibernate <wbr>spring <wbr>读存取 <wbr>blob <wbr>86字节,Oracle11g都出这么长时间了,怎么没有与Oracle11g相关的信息呢?



摘一段关于其他Oracle版本的信息吧:

The 86 bytes is the Blob Locator perhaps?

I believe that when using Hibernate with a byte[] mapped to a Blob you can save it ok with the right driver. But when you retrieve it you'll just get the Blob Locator back in to the byte[] not the actual bytes in the Blob.



在这篇文章的评论中看到这样的信息:

One solution to get around this problem is to use the Oracle 10.1.0.4 JDBC thin driver, instead of the Oracle 9.2.0.x thin driver, to work against the Oracle 9.2.0.x database. Apparently it's related a bug in the 9.2.0.x JDBC driver.

所以我想会不会是我用的驱动也有这样的bug呢?于是我去我安装的oracle11.1.0.6下的jdbc/lib目录中把ojdbc5.jar,大小为1.79M(因为我用的jdk是1.5的),放到项目中也不行,于是去网上搜最新的驱动,最后
下载了Oracle 11g 第 2 版 (11.2.0.1.0) JDBC的ojdbc5.jar大小为1.90M,虽然版本不同但是驱动名称是一样的,所以要注意一下呀,看一下大小区分吧!
驱动下载网址也贴出来吧http://ajava.org/tool/drivers/14632.html
换上上述的驱动后,问题终于解决了,现在可以存到数据库中也能从数据库中读取取来了,不容易呀!

最后把例子中的主要代码贴出来一下:
(1)hibernate的映射文件Result.hbm.xml
<property name="resimg" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true">
            <column name="RESIMG" />
</property>
(2)把图片存到数据库中的代码:
  String fileName = "E:\\oracle01.jpg";
  // E盘下有个oracle01.jpg的图像文件
  File f = new File(fileName);
  FileInputStream fin = new FileInputStream(f);
  byte[] data = new byte[(int) fin.available()];
  fin.read(data);
  fin.close();
   
  Result rs = new Result();
  rs.setResimg(data); // POJO类中byte[] Resimg = null;
  rs.setFname("1700");
  resultDao.saveOrUpdate(rs);

(3)从数据库读出来并生成文件的代码:
  Result r = (Result)resultDao.getByIdx(53);
  byte[] b = r.getResimg();
  File file = new File("D:\\test10.gif");

  OutputStream fos = new FileOutputStream("D:\\test10.gif");
  fos.write(b);
  fos.close();
转:http://blog.sina.com.cn/s/blog_5fa32a510100i2nc.html
  • 大小: 24.9 KB
分享到:
评论

相关推荐

    spring+hibernate操作oracle的clob字段

    Spring和Hibernate会自动处理CLOB的存取,无需额外的特殊处理。例如,如果你有一个更新方法,可以如下所示: ```java public void updateEntity(Entity entity) { assessRegDao.update(entity); } ``` 其中...

    Struts+Spring+Hibernate实现上传下载

    5. **Hibernate映射**:在Hibernate的映射文件中,将Blob类型的数据库字段映射为Java的`byte[]`类型,并指定类型为`org.springframework.orm.hibernate3.support.BlobByteArrayType`。这样,Hibernate就能自动处理二...

    外加热强制循环蒸发器装配图(CAD).rar

    外加热强制循环蒸发器装配图(CAD).rar

    数控车床纵向进给系统设计.zip

    数控车床纵向进给系统设计.zip

    vault_side_off_ominous.png

    j

    爬虫 bangumi名称和评论数

    爬虫 bangumi名称和评论数

    基于SpringBoot的垃圾分类回收系统(源码+数据库+万字文档)526

    基于SpringBoot的垃圾分类回收系统,系统包含两种角色:管理员、用户主要功能如下。 【用户功能】 首页:浏览垃圾分类回收系统信息。 个人中心:管理个人信息,查看历史记录和订单状态。 运输管理:查看运输信息,垃圾回收的时间和地点。 公告管理:阅读系统发布的相关通知和公告。 垃圾回收管理:查看垃圾回收的信息,回收类型和进度。 垃圾出库申请管理:提交和查看垃圾出库申请的状态。 【管理员功能】 首页:查看垃圾分类回收系统。 个人中心:管理个人信息。 管理员管理:审核和管理注册管理员用户的信息。 用户管理:审核和管理注册用户的信息。 运输管理:监管和管理系统中的运输信息。 公告管理:发布、编辑和删除系统的通知和公告。 垃圾回收管理:监管和管理垃圾回收的信息。 垃圾出库申请管理:审批和管理用户提交的垃圾出库申请。 基础数据管理:管理系统的基础数据,运输类型、公告类型和垃圾回收类型。 二、项目技术 编程语言:Java 数据库:MySQL 项目管理工具:Maven 前端技术:Vue 后端技术:SpringBoot 三、运行环境 操作系统:Windows、macOS都可以 JDK版本:JDK1.8以上都可以 开发工具:IDEA、Ecplise、Myecplise都可以 数据库: MySQL5.7以上都可以 Maven:任意版本都可以

    这篇文章是台湾大学(NTU)计算机科学与信息工程系(CSIE)2021年秋季学期算法设计与分析课程的第一份作业(Homework#1)的具体要求和题目描述 以下是主要内容的总结:

    内容概要:本文档是台湾大学计算机科学与信息工程系2021年秋季学期《算法设计与分析》课程的第一次作业(Homework#1)。作业包含四道编程题和三道手写题,旨在考察学生对算法设计和分析的理解与应用能力。编程题涉及汉诺塔、数组计算、矩形点对、糖果分配等问题;手写题涵盖渐近符号证明、递归方程求解、幽灵腿游戏优化、不公平的卢卡斯问题等。文档详细描述了每个问题的具体要求、输入输出格式、测试用例以及评分标准。此外,还提供了编程技巧和注意事项,如避免延迟提交、正确引用资料、处理大输入文件等。 适合人群:具备一定编程基础的本科生或研究生,特别是修读过或正在修读算法设计与分析相关课程的学生。 使用场景及目标:①帮助学生巩固课堂所学的算法理论知识;②通过实际编程练习提高解决复杂问题的能力;③为后续更深入的学习和研究打下坚实的基础。 其他说明:此作业强调团队合作和个人独立思考相结合的重要性,鼓励学生在讨论后用自己的语言表达解决方案,并注明参考资料。对于编程题,特别提醒学生注意输入文件可能较大,建议采取适当的优化措施以确保程序运行效率。

    基于SpringBoot的铁路订票管理系统(源码+数据库+万字文档+ppt)528

    基于SpringBoot的铁路订票管理系统,系统包含两种角色:管理员、用户主要功能如下。 【用户功能】 首页:浏览铁路订票管理系统的主要信息。 火车信息:查看火车的相关信息,包括车次、出发地、目的地和票价等。 公告资讯:阅读系统发布的相关通知和资讯。 后台管理:进行系统首页、个人中心、车票预订管理、车票退票管理等操作。 个人中心:管理个人信息,查看订单历史记录等。 【管理员功能】 首页:查看铁路订票管理系统。 个人中心:修改密码、管理个人信息。 用户管理:审核和管理注册用户的信息。 火车类型管理:管理系统中的火车类型信息。 火车信息管理:监管和管理系统中的火车信息,添加、编辑、删除等。 车票预订管理:处理用户的车票预订请求。 车票退票管理:处理用户的车票退票请求。 系统管理:管理系统的基本设置,公告资讯、关于我们、系统简介和轮播图管理。 二、项目技术 编程语言:Java 数据库:MySQL 项目管理工具:Maven 前端技术:Vue 后端技术:SpringBoot 三、运行环境 操作系统:Windows、macOS都可以 JDK版本:JDK1.8以上都可以 开发工具:IDEA、Ecplise、Myecplise都可以 数据库: MySQL5.7以上都可以 Maven:任意版本都可以

    塑料架注射模具设计.rar

    塑料架注射模具设计.rar

    基于json文件数据驱动的的接口测试框架.zip

    基于json文件数据驱动的的接口测试框架

    铁丝缠绕包装机设计-缠绕盘设计.rar

    铁丝缠绕包装机设计-缠绕盘设计.rar

    Linux操作系统及常用命令详解.zip

    linux

    圆柱体相贯线焊接专机工作台设计.rar

    圆柱体相贯线焊接专机工作台设计.rar

    硬币分拣机设计.rar

    硬币分拣机设计.rar

    【机器学习与数据挖掘】行业级机器学习软件开发经验与教训:从LIBSVM和LIBLINEAR看算法部署及软件设计挑战

    内容概要:本文探讨了开发行业级机器学习和数据挖掘软件的经验与教训,指出当前研究界与工业界之间的脱节问题。作者分享了开发LIBSVM和LIBLINEAR的经验,强调了用户需求的重要性。大多数用户并非机器学习专家,期望简单易用的工具来获得良好结果。文章还详细介绍了支持向量机(SVM)的实际应用案例,包括数据预处理(如特征缩放)、参数选择等步骤,并提出了为初学者设计的简易流程。此外,作者讨论了在设计机器学习软件时应考虑的功能选择、选项数量、性能优化与数值稳定性等问题,强调了软件开发与实验代码的区别以及鼓励研究人员参与高质量软件开发的重要性。 适合人群:对机器学习软件开发感兴趣的科研人员、工程师及从业者,尤其是那些希望了解如何将学术研究成果转化为实际可用工具的人士。 使用场景及目标:①帮助非机器学习专家的用户更好地理解和使用机器学习方法;②指导开发者在设计机器学习软件时考虑用户需求、功能选择、性能优化等方面的问题;③促进学术界与工业界之间的合作,推动高质量机器学习软件的发展。 其他说明:本文不仅提供了具体的开发经验和技巧,还呼吁建立激励机制,鼓励更多研究人员投入到机器学习软件的开发中,以解决当前存在的研究与应用脱节的问题。

    pandas学习代码,jypyter格式

    一天入门pandas代码

    joblib-0.12.0-py2.py3-none-any.whl

    该资源为joblib-0.12.0-py2.py3-none-any.whl,欢迎下载使用哦!

    深度学习基于PyTorch==2.6.0和Transformers==4.48.0的XTuner环境配置:AI模型开发与优化依赖库列表

    内容概要:本文档《xtuner_requirements.txt》列出了用于支持特定项目(可能是机器学习或深度学习项目)运行所需的所有Python包及其版本。其中不仅包括常见的数据处理和科学计算库如numpy、pandas,还包括了与深度学习密切相关的库如torch、transformers等。值得注意的是,文档中还特别指定了NVIDIA CUDA相关组件的具体版本,确保了GPU加速环境的一致性和兼容性。此外,文档中也包含了从GitHub直接安装的xtuner库,明确了具体的提交哈希值,保证了代码来源的精确性。 适合人群:对机器学习、深度学习领域有一定了解并需要搭建相应开发环境的研发人员,尤其是那些希望复现特定实验结果或基于已有模型进行二次开发的研究者和技术爱好者。 使用场景及目标:①帮助开发者快速搭建完整的开发环境,确保所有依赖项正确无误;②为研究人员提供一个稳定的实验平台,以便于重复实验和验证结果;③作为项目协作的基础,确保团队成员之间的环境一致性,减少因环境差异带来的问题。 阅读建议:由于该文档主要为技术性依赖列表,在阅读时应重点关注所需安装的库及其版本号,特别是CUDA相关组件和自定义库(如xtuner)的安装方式。对于非技术人员而言,可能需要额外查阅相关资料来理解各库的作用。同时,在实际操作过程中,建议按照文档中的顺序逐一安装依赖,避免版本冲突等问题的发生。

    vault_side_on_ominous.png

    j

Global site tag (gtag.js) - Google Analytics