hibernate的核心类和配置
-
Configuration类
-
加载核心配置文件hibernate.cfg.xml
-
管理关系配置
- SessionFactory接口
-
可以缓存sql和数据(session级缓存)
-
重要级的类,一个数据库对应一个SessionFactory
-
获取session(可以通过openSession()和getCurrentSession()方法获取)
openSession()与getCurrentSession()区别
-
openSession是开启一个新的session
-
getCurrentSession是获取和当前线程绑定的一个session,换言之,在同一个线程中,获取的线程是同一个session,hashcode值是一样的,这样有利于事务的控制,在核心文件hibernate.cfg.xml中配置,配置如下
<property name="current_session_context_class">thread</property>
-
选择使用原则
-
如果在同一个线程中,保证使用一个session,则使用getCurrentSession
-
如果在同一个线程中,保证使用不同的session,则使用openSession
-
通过getCurrentSession获取的session在事务提交后,会自动关闭(不要再去手动关闭,否则会报session已关闭异常);通过openSession获取的session则需要手动去关闭
-
如果通过getCurrentSession获取的session查询操作,则需要事务提交
本地事务:针对一个数据库的事务
全局事务(jta):跨数据库的事务(例如转账,工行到建行,有两个数据库)
- Session接口
1 Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
2 Session实例通过SessionFactory获取,用完需要关闭
3 Session是线程不同步的,因此要保证在同一个session中,可以使用getCurrentSession()
4 Session可以看做是持久化管理器,它是与持久化操作相关的接口
-
get()和load()方法区别
-
get()查询直接返回实体类,如果查不到数据则返回null;load()如果没有返回实体类,就会抛出org.hibernate.ObjectNotFoundException
-
使用get()先到缓存(session缓存/二级缓存)查询数据,如果没有数据,立即向数据库发送select请求;使用load()先到缓存(session缓存/二级缓存)查询数据,返回的是一个代理对象,如果没有真实使用到对象,就没有真正向数据库发送select请求,这是懒加载机制(lazy)
-
可以通过关系配置文件修改懒加载:
<class name="com.bobo.domain.User" lazy="false" table="user">
-
如何选择使用get()或者load()?
如果确定数据库有具体某条数据,使用load();如果不确定,则使用get()(这样使用效率高)
- Transaction类,事务类
-
事务开始beginTransaction,提交submit,回滚rollback等方法
-
必须有事务提交,才可以更新数据到数据库
- 核心配置文件hibernate.cfg.xml
-
配置对应的数据库信息:数据库连接,用户名,密码,方言等
-
加载数据库驱动
-
指定加载映射关系配置文件
- 类与数据库表的关系配置
文件命名规则:一般是类名.hbm.xml
-
表名和字段名都要对应上类名和属性名
-
主键的生成策略