?
???????hibernate的核心类和配置
?
?
加载核心配置文件hibernate.cfg.xml
管理关系配置
?
可以缓存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):跨数据库的事务(例如转账,工行到建行,有两个数据库)
????? 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()(这样使用效率高)
?
事务开始beginTransaction,提交submit,回滚rollback等方法
必须有事务提交,才可以更新数据到数据库
?
?
?
配置对应的数据库信息:数据库连接,用户名,密码,方言等
加载数据库驱动
指定加载映射关系配置文件
?
?
??? 文件命名规则:一般是类名.hbm.xml
?
表名和字段名都要对应上类名和属性名
主键的生成策略
?