yunshichen

我相信人生是值得活的,尽管人在一生中必须遭受痛苦,卑劣,残酷,不幸和死亡的折磨,我依然深信如此.但我认为人生不一定要有意义,只是对一些人而言,他们可以使人生有意义. ---J 赫胥黎

Hibernate经验心得技巧



怎样取得hsql的返回值

取多个字段,Hibernate把每个id和name做成一个2个元素的单维数组,List实际上是一个单维数组的集合。

Query q = s.createQuery("select Cat.id, Cat.name, from Cat ");;
List l = q.list();;
for (int i=0;  i< l.size();; i++); {
  Object[] row = (Object[]); l.get(i);;
  Long id = (Long); row[0];
  String name = (String); row[1];  
}

在这种情况下,HQL是不会去构造PO的





get(find) 和 load的区别

http://blog.csdn.net/cin_ie/archive/2009/07/13/4345475.aspx
http://blog.csdn.net/kunmingkunlun/archive/2008/03/20/2198818.aspx

简单总结

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。


之所以记下这个主题, 是今天在arm里发现一个很骇人的查询性能问题. 某处程序出错, 原因是该对象的引用对象的父对象id不存在, 于是我随随便便写了个find语句去取出对象. 举例如下


A.getB.getC.getId


在hbm里, a引用了b,b引用了c. 但因为如果不用lazy的模式,hsql会立刻找出所有的对象关系树. 恰好这几个对象都大量引用了其他对象. 最后就这个小小的操作,居然执行了将近50条sql查询语句!


经验总结:

1) 在查询多表关联的时候,尽量用jdbc. 如果一时贪方便用hsql, 那么也要用query方法而不是直接find,load. 并且做好良好的dao接口. 这样在该方法出现性能问题时,可以在dao实现里修改而不影响业务逻辑.

2) 侧面证明了把sql/hsql放在dao层的重要性. 对很简单的sql, 放在service和dao的区别不大, 但如果预见到该方法查询的数据多, 可能出现性能问题, 那么尽量将之放到dao. 当然, 这和程序员的经验有关.




hibernate 2.1连ORACLE有错,需查看SQL,可是UPDATE或INSERT中的值都被替换成“?”,如何才能显示出完整的SQL呢?

  在WEB-INF/classes/log4j.properties添加如下内容:

  ### log just the SQL
  log4j.logger.net.sf.hibernate=info
  ### log just the SQL
  #log4j.logger.net.sf.hibernate.SQL=debug
  ### log JDBC bind parameters ###
  log4j.logger.net.sf.hibernate.type=debug

posted on 2009-12-25 23:41 Chenyunshi 阅读(448) 评论(0)  编辑 收藏 引用 所属分类: 经验心得技巧

只有注册用户登录后才能发表评论。
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

相册

搜索

最新评论

阅读排行榜

评论排行榜