• 2008-03-20

    oracle tips - [绝世高手]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://nkelsewhere.blogbus.com/logs/17344422.html

      生产环境的数据出了问题,昨天下班后,一直再恢复数据,因为脏数据产生后,又有大量的数据在运行,所以不能用备份策略把数据恢复到初始值,只能按照业务逻辑,反向将的对相关的数据进行操作,该删的删掉,该修改的字段进行必要的修改。
      为了尽可能的保护好生产环境,所以将数据备份到本地,然后一点点的调试,一边调试一边把sql语句添加到.sql文件,这样在本地调试成功好了之后,切换到生产环境,直接运行sql文件,所有的脏数据都被不留痕迹的干掉了。
      回到家已经快2点了,累的不行了,看来真的衰老了,唉。

       这两天一直在和跟oracle纠缠不清。

      树状结构存储在一个表中,就会有一个外键与本表关联,这样把一个树状结构变成一条条的记录,然后再用外部的业务逻辑将一条条的记录组装成树状结构。对于树的遍历和组装是离不开递归算法的,所以消耗也是比较大的。
      庆幸的是,oracle提供递归的查询子句——start with id .... connect by prior
      向下递归,也就是查询某一节点下的所有子节点:
      select * from table start with id=*** connect by prior id=parentid
      向上递归,也就是查询某一节点的各级父节点:
      select * from table start with id=*** connect by prior parentid=id
      hibernate的hql语句原则上不支持递归查询,因为这是oracle的特有子句,并不通用于其他数据库系统,但是貌似可以通过修改hibernate的源码,使其支持递归查询。
      其实也不是很必要,使用hibernate直接执行sql就可以了,只是取的时候最好只取id,把id取出来之后,再进行处理也就方便多了。

      hibernate中hbm.xml的继承关系
      假设有两个对象A(id, a),B(id,b),B继承A,AB对应两个hbm.xml,又分别映射2个表,各自存自己的属性,AB一一对应,以id为主键进行关联。因为B是A的子类,所以在对象中,B有a属性,假设这时候我们要查找所有满足条件a='else'的B,那么传统的sql如下:
      String sql = "select tb.* from A ta, B tb where tb.id=ta.id and ta.a='else'";
      然而在配置好的hbm之后,就可以用如下hql语句进行查询了:
      String hql = "select ob from B ob where ob.a='else'";
      显然hql语句更OO一些。继承关系的hbm.xml是这样配置的:
      <hibernate-mapping package="...">
        <class name="A" table="A">
          <id name="id" type="integer" column="id">
          <property name="a" column="a" type="String" length="10"/>
        </class>
      </hibernate-mapping>


      <hibernate-mapping package="...">
        <joined-subclass name="B" table="B" extends="A">
          <key column="id" />
          <property name="b" column="b" type="String" length="10"/>
        </joined-subclass>
      </hibernate-mapping>

      再说最后一句,oracle给自己预留的关键字还真多啊,action,level,order,status,number。。。。几乎常用的属性都被它保留了,真让人不爽,你们自己预留的关键字,前面加小下划线不就完了嘛,说白了就是故意的。





    评论

  • 刚上传了照片,还没来得及写字
  • 咦?
    我是来看片子的哦~~~
    嘿嘿嘿~~~