能力有限—努力无限

天道酬勤

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
我想大家用了hibernate之后,大概都有一些感慨,虽然应用了orm的先进技术,操作数据库可以像操作对象一样,真正的面象对象。
虽然带来很多优点,比如使用标准hql可以跨数据库系统平台,可以用lazy延迟技术,提高数据库访问效率,以及比较方便操作的级联操作等等

      但在实际操作中,不免遇到很多问题,我暂时小结如下:
1.序列不存在或主/外键冲突等问题
 
通常在我们生成映射文件的时候,有时表里忘了设主键,或是hbm。xml映射文件中忘了设置主键的序列等都会引起。建议在表中不要
存在外键,这样在使用database Exploer生成hbm.xml和po的时候可能会发生一些关系,使用中没有留意而导致一些不必要的问题。

        2.空数据引起的CGLIB问题
        有时代码检查确实没有错,但是我们可能会忽略了数据库的问题。比如像数据库的数字弄numberic或者是date数据为空的时候,那么
在hibernate查询的时候可能就会产生这个问题。

3.hibernate查询的中文问题
有时我们需要查询关键字,但一般在测试的时候可能会忽略了中文,在hql中我们使用 from Tab a where a.title='中文',
这时就会出现问题,我们必须用参数的形式来做,如用from Tab a where a.title=? 或者from Tab a where a.title=:
title等方法就没有问题了,在后续的hibernte3.1好像已经可以不用参数了。

4.一对一、一对多或者多对多操作时的问题
这个问题我想是大家比较困扰的问题,而且一个比一个复杂。不过只要搞清楚inverse,cascade,以及po之间的互设的关系,我想一
般是没有什么太大的问题。通常父子操作时我们会将lazy设为false,以便能将父子关系相关数据一起取出,进行级联操作。其实做增加都不是
最大的问题,一般是做修改的问题比较大。所以通常我们必须使用get或者load取出数据,将必须修改的数据,更新完使用update更新。但是对
于复杂的父子关系,如一对多,最好是怕多方的表的数据删完重新添加,这样就不会出现冗余数据等的问题。

5.大字段LOB操作的问题
这个问题也是比较棘手,但不论是hibernate和jdbc,他们的操作方法都基本差不多。还有值得大家注意的时候,希望能够在操作大字
段的时候能保证使用一个会话,即session。如果是使用spring的hibernateTempate可能会出现一些问题,因为默认模板是执行完就把session
关闭掉的。如果大字段所处的是子表的话,在父表中的lazy可以设为false,在子表中的大字段可以设置lazy=true,以免只是操作简单的列表
取出太大的数据,影响性能。
步骤如下:
    JDBC操作:
    1).写入:
    获得Connection连接
      设置Connection自动提交事务为false
    更新空LOB(empty_clob(),empty_blob())数据库
      select取出LOB数据并使用更新锁
    插入LOB数据
    更新并提交
    2).读取
    获得Connection连接
  取出LOB字段类型
    使用输入流还原文本或文件

Hibernate操作:
1).写入:
    获得Session打开事务
    使用Hibernate对象创建LOB对象
    保存对象并加上更新锁
    取出LOB对象并对其更新
    提交事务
2).读取
    获得Session会话
    取出LOB字段类型
    使用LOB输入流输出文本或文件
posted on 2008-08-27 20:01  余兴  阅读(236)  评论(0)    收藏  举报