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 row with 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 语句