浏览 4391 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-16
原来用的oracle 的vachar2 4000字节,感觉应该不小了,没想到没写几个字就完了,没办法,只有用oracle 的Clob了,可是怎么做了,上网查了好多,总结一下。。。 借用一下: 一、问题需求: 1.在持久化类中字段该用什么类型? 二、解决: 如果你用的是oracle 8 那就不用看了,因为下面的方法,好像行不通,你只能再接再励另找方法了! 我的环境 oracle 10g 1.0.1,spring 1.2 ,hibernate 3.
1.持久类映射字段的类型: 1.1 Blob 用byte[]; 1.2 Clob 用String; 2.Spring 配置文件:
<!-- Oracle 9i 以上,oracle 10g 10.1.0.1以下 --> <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true"/> <!-- spring 的操作句柄 --> <bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true"> <property name="nativeJdbcExtractor"> <ref local="nativeJdbcExtractor"/> </property> </bean> 2.1 往sessionFactory 中注入 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> <!--把oracleLobHandler加入sessionFactory中 --> <property name="lobHandler" ref="lobHandler"/> </bean> 3. hibernate 配置
<property name="content1" column="CONTENT1" type="org.springframework.orm.hibernate3.support.ClobStringType" length="10000"/> 注意:length 是字节
4.大功就快造成了。就差这么一步 private String content1; public String getContent1() { return content1; } public void setContent1(String content1) { this.content1 = content1; } 就这样直接用吧,spring 把过程都写了,我们就透明着使用吧
PS:关于网上说的 oracle 10g 1.0.2.0以上版本可用ojdbc14.jar 保留意见!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-20
对不起啊,上面的解决方案有问题的。这个困扰我一天多的问题终于解决了,这是个惨痛的教训啊。
废话少说,开始总结: 1.换ojdbc14.jar oracle 最新的驱动 ,说说简单,说来也是,不过当你遇到什么”error1 :无法连接...“时可能也会烦恼: 上网查了,将myeclipe 下的eclipse.ini 原: -showsplash com.genuitec.myeclipse.product --launcher.XXMaxPermSize 256m -vmargs -Xms128m -Xmx512m -Duser.language=en -XX:PermSize=128M -XX:MaxPermSize=256M改成 -showsplash com.genuitec.myeclipse.product --launcher.XXMaxPermSize 256m -vmargs -Xms128m -Xmx512m -Duser.language=zh -XX:PermSize=128M -XX:MaxPermSize=256M 2.在映射文件中,将 clob 字段 映成 java.sql.Clob: <property name="content1" type="java.sql.Clob" update="true" insert="true"> <column name="CONTENT1" /> </property> 2.1持久类中 private Clob contentclob; private String contentStr; 2.2 关于保存: Hibernate DAO 中的代码 public void saveClob(TmQuestion tmQuestion) { Session session=getHibernateTemplate().getSessionFactory().openSession(); Transaction tran=session.beginTransaction(); tmQuestion.setContentclob(Hibernate.createClob(" ")); session.update(tmQuestion); session.flush(); session.refresh(tmQuestion,LockMode.UPGRADE); SerializableClob sc= (SerializableClob)tmQuestion.getContentclob(); Clob wrapclob = sc.getWrappedClob(); CLOB clob = (CLOB)wrapclob; /* CLOB clob = (CLOB) bbsRoot.getContent1();//error */ Writer out; try { Writer characterOutputStream = clob.getCharacterOutputStream(); out = characterOutputStream; // out.write(bbsRoot.getContent1Str()); out.write(tmQuestion.getContentStr()); out.close(); tran.commit(); session.close(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println(e.toString()); } } 2.3 读Clob Clob clob = tmQuestion.getContentclob();// 取得Clob的值 if (clob != null) { String clobString = ""; try { clobString = clob.getSubString(1, (int) clob.length());// 将Clob类型的值转换成String类型的值 tmQuestion.setContentStr(clobString);// 通过setter方法,设置String值,然后就可以通过instance.getInfoContentToString()来取值了 } catch (SQLException e) { e.printStackTrace(); } } return tmQuestion; |
|
返回顶楼 | |
发表时间:2009-04-20
太麻烦了。Hibernate已经自己解决了Clob的问题,可以直接使用String进行映射。而且配置文件里也只需要写几句话。具体你可以参考我的博客文章
|
|
返回顶楼 | |