初学Hibernate(一)
?
Hibernate简单开发步骤:
1、准备工作:引入Hibernate包及其依赖包和jdbc驱动包,并在Hibernate文件中的project/etc下,拷贝log4j.properties放到项目类路径中
2、创建实体类:实体类一般指的是只有attrbute和property的java类,并且这个类必须有一个无参的构造方法
3、创建实体类映射文件(User.hbm.xml)可从示例project\tutorials\eg\src\main\resources\org\hibernate\auction目录下拷贝,一般与model放一个包下;
4、创建Hibernate配置文件hibernate.cfg.xml;
hibernate.cfg.xml文件->project\tutorials\web\src\main\resources\找到hibernate.cfg.xml文件,有关数据库连接配置->project/etc/hibernate.properties找到其中的配置
5、利用Hibernate API测试下
读取类路径根目录下的hibernate.cfg.xml配置文件,创建SessionFactory,创建Hibenate Session
开启事务—>CRUD操作—>持久化对象—>提交事务—>出现异常,需回滚事务—>关闭session,一般R不用什么事务处理
Hibernate的UD操作:
1.????????在session更新时,应当注意先把对象load上来,然后更新它,那么这个对象就是持久化的对象了,其他字段或属性更新时就不会置为空,因为Hibernate会把所有的属性更新一遍,结果原来的属性如果变化了则更新,没变化则还是原来的值;假如是new出来然后setId接着set属性,这样的话,因为这个new出来的对象是离线对象,接着update会把它更新成持久化对象,相应的其他没更新的属性也要更新。
2.????????delete则不会发生上面的现象,因为delete是把持久化对象弄成瞬时对象,因此就不会出现上面的现象。
Hibernate的load延迟加载:
1.????????调用load方法时(在设置lazy为TRUE的情况下),会出现延迟加载的现象,当真正使用到这个对象的属性时才发Sql语句,但有人会奇怪取得这个对象的id时却没发出sql语句,因为load本身就是根据id来load的,所以id它本身就在内存中,如下面的语句:session.load(User.class, 8),这个8已经存在内存中了。
2.????????Hibernate中查找不存在的记录用get或者设置成false的load,会抛出ObjectNotFoundException: No rowwith the given identifier exists,而设置成lazy=true则不会报错,但在真正使用到这个对象的属性时会报错ObjectNotFoundException
3.?????????懒加载只有在session打开的状态下才有效,session关闭将不会再加载延迟对象,假设这属性已经存在的话,它就不会抛这个异常,因为这个对象的属性已经加载到内存中LazyInitializationException:could not initialize proxy - no Session
4.????????比较get操作,它一执行完立马发出sql语句
Session什么时候发出insert/update/delete/select语句
1.?????id生成策略是native,调用save方法,马上发出insert语句,将内存中的状态同步到数据库,id生成策略是uuid,提交后才发出insert语句。
2.????????关于更新操作,一般先get或load加载这个对象到内存中,然后更新的话Hibernate会检查更新的属性有没有变化,没变化则不会发sql语句,有变化才发出update语句,因此更新持久化的对象时没必要显示地调用update方法,因为提交后才发出sql,删除也一样的,Hibernate它会尽量延迟发出sql语句
?