MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

hibernate处理LOB

Posted on 2009-07-31 00:05 leekiang 阅读(910) 评论(0)  编辑  收藏 所属分类: hibernate
1,摘自http://www.javaeye.com/topic/13335
Oracle9iR2和Oracle10G以上版本已经可以直接进行clob的插入,条件查询,模糊查询了。这一点,你可以试一试,我这周周一刚刚在 Oracle10.1.0.3 Linux x86上面试过,不管是where还是like,就像varchar2一样处理。
另外将Oracle JDBC Driver升级到最新的版本,即Oracle10.1.0版本同时发布的odjbc14.jar,那么你将直接可以对clob进行操作。
也就是说,如果你使用最新的Oracle JDBC Driver,使用比较新的Oracle版本,你就可以直接像操作varchar2那样操作clob,没有任何限制了。
4000字符的限制完全是因为Oracle的Thin Driver造成的,用OCI Driver是不会有这个问题的。也就是说,这个限制与驱动相关与数据库无关。
我试过使用10g的驱动跑9i的数据库,操作CLOB字段就和操作varchar2一样,并且没有4000的限制。一换成9i的Driver就错误依旧。。。8i的没有测试过,不过原理应该一样。
像Robbin说的那样,我用的是最新的最新的Oracle Database 10g (10.1.0.2.0) 驱动程序,数据库是Release 9.2.0.1.0 ,插入一条10万多字符的数据到clob类型的字段,抛出异常:Caused by: java.sql.SQLException: setString 只能处理少于 32766 个字符的字符串。我试了多次,还是无法解决。
Robbin说的没错,我试过了在xxx.hbm.xml中将数据库中Clob类型的字段映射成Hibernate的text类型,没有任何限制,但是映射成java.lang.String类型却有32K大小的限制。
oracle 10g 的驱动的确好
thin driver 也能顺利按照 String 方式处理 Clob 字段,可以适用于 8.16 以后的所有版本
映射成text在同一列中有多个clob字段的时候有bug,
保存时会将后一个字段的内容保存到前一个字段里面去,不知道什么原因,我实在有些莫名其妙。
换成spring的ClobStringType后一切正常
经测试,使用 Oracle 10g 的 JDBC 驱动,可以把 LONG 类型的字段当成超长的 VARCHAR2 类型字段看待。
注意:数据库中应该使用 LONG 型,而不是 CLOB 类型。使用 CLOB 类型,如果有中文,会莫名其妙的丢掉一些字符。这应该是 Oracle 的一个 bug。
适用于 Oracle 9.2 以上版本的数据库。(注意仅仅是使用 10g 的 JDBC 驱动而已,即 ojdbc14.jar 包)

参考:
* Oracle JDBC 驱动下载地址 http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
* Handling CLOBs - Made easy with Oracle JDBC 10g http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html

只有注册用户登录后才能发表评论。


网站导航: