网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java学习之hibernate配置要点详谈     
  文章作者:未知  文章来源:水木森林  
  查看:91次  录入:管理员--2007-11-17  
 
  1.两种配置文件:
  a.hibernate.cfg.xml和b.hibernate.properties
  
  a中可含映射文件的配置,而b中hard codes加映射文件。
  
  a.configuration config=new configuration().config();
  b. configuration config=new configuration();
  config.addclass(tuser.class);
  
  2.你不必一定用hibernate.cfg.xml或hibernate.properties这两文件名,你也不一定非得把配置文件放在classes下,  file file=new file("c://sample//myhibernate.xml");  configuration config=new configuration().config(file);
  
  3. session.flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush在session关闭时也会调用flush
  
  4. hibernate总是使用对象类型作为字段类型
  
  5. xdoclet专门建立了hibernate doclet,就是在java代码上加上一些java doctag,后来再让xdoclet分析该java代码,生成映射文件;
  
  6.hql子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。
  
  7.关系:  constrained : 约束,表明主控表的主键上是否存在一个外键(foreigh key)对其进行约束。
  
  property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名
  
  单向一对多需在一方配置,双向一对多需在双方进行配置
  
  8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控方指定的collection类型属性中
  
  9. java.util.set或net.sof.hibernate.collecton.bag类型的collection
  
  10.重要:inverse:用于标识双向关联中的被动方一端。
  
  inverse=false的一方(主控方)负责维护关联关系.默认值:false
  
  11.batch-size:采用延迟加载特征时,一次读入的数据数昨。
  
  12.一对多通过主控方更新(主控方为一方时)
  
  user.getaddresses().add(addr);
  
  session.save(user);//通过主控对象级联更新
  
  13.在one-to-many 关系中,将many 一方设为主动方(inverse=false)将有助性能的改善。在一方设置关系时,inverse=true,即将主控权交给多方,  这样多方可主动从一方获得foreign key,然后一次insert即可完工。
  
  addr.setuser(user);//设置关联的tuser对象
  
  user.getaddresses().add(addr);
  
  session.save(user);//级联更新
  
  14.只有设为主控方的一方才关心(访问)对方的属性,被动方是不关心对方的属性的。
  
  15.one-to-many与many-to-one节点的配置属性不同:
  
  一对多关系多了lazy和inverse两个属性多对多节点属性:
  
  column:中间映射表中,关联目标表的关联字段
  
  class:类名,关联目标类
  
  outer-join:是否使用外联接
  
  注意:access是设置属性值的读取方式。
  
  column是设置关联字段。
  
  16.多对多,注意两方都要设置inverse和lazy,cascade只能设为insert-update
  
  多对多关系中,由于关联关系是两张表相互引用,因此在保存关系状态时必须对双方同时保存。
  
  group1.getroles().add(role1);  role1.getgroups().add(group1);
  
  session.save(role1);  session.save(group1);
  
  17.关于vo和po  vo经过hibernate容量处理,就变成了po(该vo的引用将被容器保存,并且在session关闭时flush,因此po如果再传到其它地方改变了,就危险了)    vo和po相互转换:beanutils.copyproperties(anotheruser,user);
  
  18.对于save操作而言,如果对象已经与session相关联(即已经被加入session的实体容器中),则无需进行具体的操作。因为之后的session.flush过程中,hibernate 会对此实体容器中的对象进行遍历,查找出发生变化的实体,生成并执行相应的update 语句。
  
  19.如果我们采用了延迟加载机制,但希望在一些情况下,实现非延迟加 载时的功能,也就是说,我们希望在session关闭后,依然允许操作user的addresses 属性 hibernate.initialize方法可以通过强制加载关联对象实现这一功能: 这也正是我们为什么在编写pojo时,必须用jdk collection接口(如set,map), 而非特定的jdk collection实现类(如hashset、hashmap)申明collection属性的 原因。
  
  20.事务:从sessionfactory获得session,其自动提交属性就已经关闭(autocommit=false),此时若执行了jdbc操作,如果不显式调用session.begintransaction(),是不会执行事务操作的。
  
  jdbc transaction:基于同一个session(就是同一个connection)的事务;
  
  jta transaction:跨session(跨connection)事务.
  
  对于jta事务,有三种实现方法:
  
  a。usertransaction tx=new initialcontext().lookup("...");
  tx.commit();
  
  b. 使用hibernate封装的方法:(不推荐)
  
  transaction tx=session.begintransaction();
  tx.commit();
  c. 使用ejb之sessionbean的事务技持方法,你只要在把需要在发布描述符中,把需要jta事务的方法声明为require即可
  
  21.悲观锁,乐观锁:  乐观锁一般通过version来实现,注意version节点必须出现在id后。
  
  22.hibernate中,可以通过criteria.setfirstresult和criteria.setfetchsize方法设定分页范围。
  
  query接口中也提供了与其一致的方法,hibernate主要在dialect类中实现在这个功能。
  
  23.cache
  
   ……
  
  net.sf.ehcache.hibernate.provider 

  
  还需对ecache本身进配置
  
   

  
  之后在映射文件中指定各个映射实体的cache策略
  
  
  ....
  
  
  ....
  

  
  ***************************************************** query.list()跟query.iterate()的不同: 对于query.list()总是通过一条sql语句获取所有记录,然后将其读出,填入pojo返回; 但是query.iterate(),则是首先通过一条select sql 获取所有符合查询条件的记录的 id,再对这个id 集合进行循环操作,通过单独的select sql 取出每个id 所对应的记 录,之后填入pojo中返回。
  
  也就是说,对于list 操作,需要一条sql 完成。而对于iterate 操作,需要n+1 条sql。,list方法将不会从cache中读取数据。iterator却会。
  
  24.threadlocal:它会为每个线程维护一个私有的变量空间。实际上, 其实现原理是在jvm 中维护一个map,这个map的key 就是当前的线程对象,而value则是 线程通过threadlocal.set方法保存的对象实例。当线程调用threadlocal.get方法时, threadlocal会根据当前线程对象的引用,取出map中对应的对象返回。
  
  这样,threadlocal通过以各个线程对象的引用作为区分,从而将不同线程的变量隔离开来。
  
  25.hibernate官方开发手册标准示例:
  
  public class hibernateutil { private static sessionfactory sessionfactory;
  static { try { // create the sessionfactory sessionfactory = new configuration().configure().buildsessionfactory();
  } catch (hibernateexception ex) { throw new runtimeexception( "configuration problem: " + ex.getmessage(), ex );
  } } public static final threadlocal session = new threadlocal();
  public static session currentsession() throws hibernateexception { session s = (session) session.get();
  // open a new session, if this thread has none yet if (s == null) { s = sessionfactory.opensession();
  session.set(s);
  } return s;
  } public static void closesession() throws hibernateexception { session s = (session) session.get();
  session.set(null);
  if (s != null) s.close();
  } }
  
  26.通过filter实现session的重用:
  
  public class persistencefilter implements filter { protected static threadlocal hibernateholder = new threadlocal();
  public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception { hibernateholder.set(getsession());
  try { …… chain.dofilter(request, response);
  …… } finally { session sess = (session)hibernateholder.get();
  if (sess != null) { hibernateholder.set(null);
  try { sess.close(); } catch (hibernateexception ex) { throw new servletexception(ex);
  } } } } ……}福建JSP技术网 -->
 
 
上一篇: weblogic中将sessionfactory配置为jndi    下一篇: 开发框架 hibernate3.0 开发实例
  相关文档
随机数 获取背景音乐 11-17
在weblogic portal里加入struts的应用程序主要步骤 11-17
情人碰面的问题:java代码概述 11-17
互联网发展web的未来是语义的 11-17
final方法 11-17
教程:在j2me中基于udp协议编程 11-17
java的网络功能与编程3 11-17
java应用技巧:se6调用编译器的两种方法 05-21
java基础知识:kvm的扩展 11-17
java程序把word文档直接转换成html文件 11-17
在eclipse 3.1体验j2se 5.0新特性七(图) 11-17
flashlite与j2me的全方位分析比较 11-17
2006-2007年度java平台开发工具的应用状况 11-17
提高java代码的性能 11-17
让poi架起java与office之间的桥梁一 11-17
hibernate+ehcache二级缓存技术 11-17
java的quoted-printable解码器源代码 11-16
我为什么学习hibernate 11-17
java 电 子 商 贸 结 构 11-17
tomcat 5.0-5.5连接池配置指南 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息