Hibernate核心接口:
Session,SessionFactory,Configuration,Transaction,Query,Criteria,
1.Session接口负责执行被持久化对象的crud(crud的任务:完成与数据库交流包含很多常见SQL)
2.SessionFactory接口负责初始化Hibernate,并负责创建Session对象
3.Configuration类负责配置并启动Hibernate,创建SessionFactory对象,Hibernate启动是,Configuration首先定位映射文档位置,读取配置,然后创建SessionFactory对象
4.Transaction接口负责事物相关操作,可选的,也可以编写自己的底层事物
5.Query和riteria接口负责执行各种数据库查询,可以使用HQL,和SQL两种表达式
Hibernate工作原理:
1.通过Configuration().configure()读取并解析Hibernate.cfg.xml配置文件
2.由Hibernate.cfg.xml中的<mappingresource=“com/xx/use.hbm.xml”>读取解析映射文件
3.通过Config.buildSessionFactory(),得到SessionFactory对象
4.SessionFactory.openSession(),启动Session
5.session.beginTransaction(),开启事物
6.persistent operate 操作数据,持久化操作
7.session.getTransaction().commit();提交事物
8.关闭session
9.关闭SessionFactory
为什么使用Hibernate:
1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复代码
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,很大程度上简化DAO层的编码工作
3.Hibernate使用Java反射机制,而不是字节增强程序来实现透明性
4.Hibernate性能非常好,它是个轻量级框架,映射的灵活性很出色,支持各种关系数据库,从一对一到多对多的各种复杂关系
Hibernate如何延迟加载, get()和load()的区别:
1.get()方法:Hibernate会确认该id对应的数据是否存在,首先在session中查找,然后在二级缓存中查找,都没有的话,就去数据库中查找,数据库没有就返回null;
2.load()方法:加载实体对象的时候,要根据映射文件上类级别的lazy属性的配置(默认为true)
①:lazy=true时,首先在session缓存中查找,看看该id对应的对象是否存在,不存在使用延迟加载,返回实体的代理对象,与到具体用到该对象的时候,再查询二级缓存和数据库,如果查不到,就会抛出一个ObjectNotFoundException
②:lazy=false时,和get()方法一样
get() 和 load()方法的主要区别
1.没有符合条件的记录,get()方法返回null,laod()方法则抛出一个ObjectNotFoundException
2.laod()方法可返回没有加载实体数据的代理实例,get()方法,永远返回有实体数据的对象
如何优化Hibernate:
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bay,多对多集合使用set
6.继承类使用显式多态
7.表字段少,表关联不要怕多,有二级缓存撑腰