在实际的Hibernate应用中,使用到的Hibernate核心接口与类并不多。要更深入地使用Hibernate,还需要学习Hibernate的延迟加载和缓存处理等高级的内容。下面附上Hibernate核心类和接口的层次图:
- 最底层的配置文件,在上一讲有详细讲解配置。
Configuration 类
org.hibernate.cfg.Configuration 实例代表了一个应用程序中 Java 类型到SQL数据库映射的完整集合。作用如下:
- 负责管理hibernate的配置信息。
- 读取hibernate.cfg.xml中的配置信息。
- 加载hibernate.cfg.xml配置文件中配置的驱动,url,用户名,密码,连接池。
- 管理对象映射文件*.hbm.xml(
例:<mapping resource=”com/cmj/domain/Employee.hbm.xml”>
)
SessionFactory
当所有映射定义被 org.hibernate.cfg.Configuration 解析后,应用程序必须获得一个用于构造 org.hibernate.Session 实例的工厂。这个工厂将被应用程序的所有线程共享:
- 可以缓存sql语句和数据(称为session级缓存)
- 是一个重量级的类,因此我们需要保证一个数据库,有一个SessionFactroy
- 通过SessionFactory借口可以获得session实例(getCurrentSession(),openSession())
注:openSession()区别getCurrentSession()
1.openSession() 是获取一个新的session.
2. getCurrentSession () 获取和当前线程绑定的session,换言之,在同一个线程中,我们获取的session是同一session,这样可以利于事务控制
如果希望使用 getCurrentSession 需要配置 hibernate.cfg.xml中配置.
配置:thread将session与线程绑定。
3. 如何选择
原则:
①如果需要在同一线程中,保证使用同一个Session则,使用getCurrentSession()
②如果在一个线程中,需要使用不同的Session,则使用opentSession()
4. 通过 getCurrentSession() 获取的session在事务提交后,会自动关闭,通过openSession()获取的session则必须手动关闭
5. 如果是通过getCurrentSession() 获取 sesssion ,进行查询需要事务提交.
session(会话)
- Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
- Session实例通过SessionFactory获取,用完需要关闭。
- Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSession()。
- Session可以看做是持久化管理器,它是与持久化操作相关的接口
几个重要的方法
- 保存一个对象(记录)—-save方法
- 删除一个对象(记录)—-delete方法
- 查询一个对象(记录)—-get/load方法
- 修改一个对象(记录)—-update方法