Hibernate集成spring读写oracle clob.docx_第1页
Hibernate集成spring读写oracle clob.docx_第2页
Hibernate集成spring读写oracle clob.docx_第3页
Hibernate集成spring读写oracle clob.docx_第4页
Hibernate集成spring读写oracle clob.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate集成spring读写oracle clob完全版前言Hibernate操作oracle clob字段是个大难题,网上的很多范例不详。Hibernate与spring集成后操作又有区别,学习者不知从何下手。本文讲解了读写oracle clob大对象的实现,并且带有完整的可运行范例下载。希望对学习者有所帮助。本文的内容如下1. 数据库的脚本2. spring与hibernate的集成配置3. 实体类的配置4. DAO层和BO层的实现5. 测试代码6. 错误代码以及原因一、 数据库脚本表建在scott模式下,密码tigercreate table demo(id number(10) primary key,content clob)/测试在过程中的content字段是否写入select * from demo;/或者更专业的测试DECLARE clob_var CLOB; amount INTEGER; offset INTEGER; output_var VARCHAR2(300);BEGIN SELECT content INTO clob_var FROM demo WHERE id=3; amount := 150; - 要读取的字符数 offset := 1; - 起始位置 DBMS_LOB.READ(clob_var,amount,offset,output_var); DBMS_OUTPUT.PUT_LINE(output_var);END;spring与hibernate的集成配置org.hibernate.dialect.Oracle9Dialect0com/demo/to/DemoTO.hbm.xmlPROPAGATION_REQUIREDPROPAGATION_REQUIRED,readOnlyPROPAGATION_REQUIRED *BOTransactionInterceptor3个提示:1. 批处理的设置必须为002. 必须使用事务,保证BO层的操作在一个事务中3. 如果你对spring的注入依赖有疑问,我也没有办法二、 实体类的配置package com.demo.to;public class DemoTO implements java.io.Serializable /* * content 读取clob的时候使用 * contentStr 向clob字段插入数据时使用 */private Long id;private java.sql.Clob content;private String contentStr;DemoTO.hbm.xml文件1. 数据库的表只有2个字段,clob要映射为java.sql.Clob类型。当然有些人映射为String类型,如果那样做当字符串长度到一定长度时会出现错误。2. 额外加字段contentStr的目的只是为了插入数据的方便。三、 DAO层和BO层的实现DemoDAO.javapackage com.demo.dao;import java.io.IOException;import java.io.Writer;import java.sql.SQLException;import org.hibernate.lob.SerializableClob;import org.springframework.orm.hibernate3.HibernateCallback;public class DemoDAO extends HibernateDaoSupport public void save(DemoTO transientInstance) try getHibernateTemplate().save(transientInstance); catch (RuntimeException re) throw re;public void save1(final DemoTO transientInstance) try getHibernateTemplate().execute(new HibernateCallback() public Object doInHibernate(Session arg0)throws HibernateException, SQLException / 1 要创建一个只包含 的clob对象DemoTO demo = transientInstance;demo.setContent(Hibernate.createClob( );arg0.save(demo);arg0.flush();/ 2 执行select for update方法,也就是加行级排它锁arg0.refresh(demo, LockMode.UPGRADE);/ 3 模拟游标的机制,写入实际的内容SerializableClob sclob = (SerializableClob) demo.getContent();java.sql.Clob jclob = sclob.getWrappedClob();oracle.sql.CLOB clob = (oracle.sql.CLOB) jclob;try Writer out = clob.getCharacterOutputStream();out.write(transientInstance.getContentStr();out.close(); catch (IOException e) e.printStackTrace();return null;); catch (RuntimeException re) throw re;public DemoTO findById(java.lang.Long id) try DemoTO instance = (DemoTO) getHibernateTemplate().get(com.demo.to.DemoTO, id);return instance; catch (RuntimeException re) throw re;1. 只取必须的dao方法,别的省略。2. save()方法绝对不行,必须使用save1()3. 只是个demo,我不抽接口了DemoBO.javapackage com.demo.bo;import com.demo.dao.DemoDAO;import com.demo.to.DemoTO;public class DemoBO private DemoDAO demoDAO;public void setDemoDAO(DemoDAO demoDAO) this.demoDAO = demoDAO;public void addNew(DemoTO demo) demoDAO.save1(demo);四、 测试代码package com.demo.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.demo.bo.DemoBO;import com.demo.to.DemoTO;public class Test public static void main(String args) ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext.xml);DemoBO db = (DemoBO) ctx.getBean(demoBO);DemoTO demo = new DemoTO();demo.setId(1L);StringBuffer sbf = new StringBuffer(楼主注意拉,要看到这条留言啊!CLOB是可以,而且用spring封装后会发现更简单,只要 setTheClob(Clob clob)就可以了但是我用Blob却不行,不知道楼主有什么好的方法处理?);while (sbf.length() 10000) sbf.append(楼主注意拉,要看到这条留言啊!CLOB是可以,而且用spring封装后会发现更简单,只要 setTheClob(Clob clob)就可以了但是我用Blob却不行,不知道楼主有什么好的方法处理?);demo.setContentStr(sbf.toString();db.addNew(demo);1. 我在clob字段插入的内容,超过1万个字符,毕竟是字符大对象2. 另外的范例测试读取public class Test2 public static void main(String args) throws SQLException ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext.xml);DemoBO db = (DemoBO) ctx.getBean(demoBO);DemoTO demo=db.findById(1L);System.out.println(demo.getId();System.out.println(demo.getContent().getSubString(1, 100);大字段只读前100个字符五、 错误代码以及原因Exception in thread main org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not load an entity: com.demo.to.DemoTO#5; uncategorized SQLException for SQL select demoto0_.ID as ID0_0_, demoto0_.CONTENT as CONTENT0_0_ from SCOTT.DEMO demoto0_ where demoto0_.ID=? for update; SQL state 72000; error code 1002; ORA-01002: 读取违反顺序; nested exception is java.sql.SQLException: ORA-01002: 读取违反顺序Caused by: java.sql.SQLException: ORA-01002: 读取违反顺序没有正确配置事务管理save1()的方法中,save1方法只有配置bo层的事务管理才能处于同一个会话中。Exception in th

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论