1.hibernate是一个持久层框架
2.什么
是orm
- Object relationship mapping
- 编程语言:oop
- 数据库:rdbms
3.第一个hibernate应用程序
- 新建立一个工程,并且加入hibernate的支持(4.1)
- 创建PO及配置文件(建议新建一个表)
- 使用API来操作PO对象
- 获取session
- 开启事务
- 执行操作 session.save()
- 提交事务
- 关闭连接
4.核心配置文件
- 一个数据源只需要一个核心配置文件。这个文件中包含三类内容:
- 数据源配置
- Hibernate的属性配置:例如show_sql,format_sql
- 加载映射文件
5.映射文件的常用标记
- 对类的配置:
<class name=”类名” table=”表名”>
- oid属性的映射:
<id name=”属性名” type=”类型”> <column name=”列名”/> <generator> </id>
- 普通属性的映射:
<property></property>
6.mybatis和hibernate区别
- Mybatis半自动,只需要写sql语句
- hibernate全自动,只需要操作对象即可,sql语句它会替我们完成
7.如何创建Session
- Configuration:配置文件
- SessionFactory:session工厂
- Session:核心接口
- Code:
Configuration config = new Configuration().configure(); ServiceRegistry register = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); SessionFactory factory = config.buildSessionFactory(register); Session session = factory.openSession(); session.beginTransaction(); ... session.getTransaction().commit(); session.close(); factory.close();
8.Session是什么?
- Session是应用程序与hibernate之间的会话,它的作用是用来操作经过映射的实体对象
- 同时,session也是个容器,它可临时保存着PO对象的引用
- 也就是说session可以缓存数据库的数据
9.hibernate对对象修改
hibernate中如果对对象做了修改,若纳入到session的管理,不执行session的update语句也能将做出的修改写入数据库中
10.PO对象的三个状态(PO对象的生命周期)
- 瞬时态:从没有持久化,也没有纳入到session的管理
- 持久态:纳入session的管理
- 游离态:曾经是持久化对象,当前不与session关联
11.常用的方法
- flush:刷新
- save:插入;忽略主键的设置
- persist:插入,主键手动设置会报错
- load:加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)
- get: 根据oid获得对应的PO对象,如果查询不到数据,返回 null
- evict:从session中移除一个实体
- clear:从session中移除所有的对象
- close:关闭session,并从session中移除所有对象
- update:修改游离态的对象(将游离态对象转成持久态对象)
- delete:删除
12.get与load的区别
- 作用:都是根据oid获取对应的实体
- 区别:
- get会立即执行查询语句,得到的是真实对象,如果找不到,则返回null;
- load不会立即执行查询语句,返回一个代理对象,当需要访问这个实体时,才会发送sql语句,如果实体不存在,则抛出ObjectNotFoundException异常;
- 相同点:
- 查询时,先查询session缓存,如找到,无论找到的是真实对象还是代理对象,都不会再发sql语句;
13.主键的设计事项
- 每个表都应该有主键,与之对应的实体也应该有个oid
- 主键的设置应该是无意义的,最好是数字
- hibernate的主键生成方式主要方式:
- increment:自增长(最大值+1),支持int,long,short
- indentity:mysql,db2,ms sqlserver支持,数据库自身的自增长
- sequence:序列
- sql查询
select hibernate_sequence.nextval from dual;
select sq_表名.nextval from dual;
- 配置文件
<generator class="sequence"> <param name="sequence">sq_表名</param> </generator>
- sql查询
- hilo:高低算法
- native:先identity,sequence,hilo
- assigned:手动分配,不建议使用
- uuid:生成128位的码,返回的是字符串,并发Insert要求较高的系统,推荐采用
- foreign:外键(一对一)
- 一般而言,利用uuid.hex方式生成Hibernate主键将提供最好的性能和数据库平台适应性
14.PO生命周期
- POJO+XML
- POJO+annotation
- mapped Entity
15.关系映射的学习方法
- 表之间的关系
- 类之间的关系
- 映射文件的配置
16.PowerDesigner
- 建模工具
- 概念E-R图:不依赖与具体的数据库
- 物理E-R图:可以直接生成sql语句
- 步骤
- 新建一个概念E-R图
- 建立关系后,转成物理E-R图
- 生成(oracle时,要转成大写)sql语句
17.一对多映射
- 表关系:主外键
- 类之间的系:Student,TClass;
- 映射文件:
- Student.hbm.xml
- many-to-one
- Tclass.hbm.xml
- Set
- key
- one-to-many
- Set
- Student.hbm.xml
18.注意事项
- 动态sql:(class标记中的属性
dynamic-insert
,dynamic-update
) - 集合排序:set标记中指定
order-by="字段 asc|desc"
19.解决hibernate的懒加载
- 将lazy改成false
- 可以采用迫切左外连语句
- 延迟session的关闭时间(jsp显示完毕后才关闭)
- 通过OpenSessionInView的过滤器来实现,配置时,应该放在第一个Filter的位置上