| |
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技术网
--> |
|