Hibernate 有几个常用的接口,下面会一一介绍。
Configuration 接口
Configuration 接口负责加载核心配置文件到内存中。如果核心配置文件使用的是 .properties 文件,还可以通过它来加载映射文件。通过它可以得到 SessionFactory 对象!使用方式如下:
- 加载核心配置文件
//加载 hibernate.properties 文件
Configuration cfg = new Configuration();
//加载 hibernate.cfg.xml 文件
Configuration cfg = new COnfiguration().configure();
- 加载映射文件
cfg.addResource("xxx/xx.hbm.xml");
SessionFactory 接口
一个 SessionFactory 实例对象就对应一个数据库,这是一个重量级对象,它内部有很多个 Map 类型的属性,用来封装配置信息和数据库连接池以及 Hibernate 中的二级缓存,所以如果只有一个数据库,创建一个 SessionFaction 实例对象即可。
由于它具有数据库连接池的特性,所以它肯定要被设计成线程安全的。通过它可以得到 Session 对象!
Session 接口
Session 对象直接和数据库进行 CURD 操作,相当于 JDBC 中的 Connection 对象。它是线程不安全的,关于它常用的方法有以下这些:
-
Serializable save(Object obj)
,该方法负责把对象纳入 Session 的一级缓存进行管理,也就是会把瞬时态的对象变成持久态。该方法返回的是一个序列化的 id 值。 -
T get(Class c,Serializable id)
,调用该方法时,它会立即发送 sql 语句进行查询指定 id 的那条纪录,返回对应的 POJO 对象。 -
T load(Class c,Serializable id)
,调用该方法时,它并不会立即发送 sql 语句,而是返回一个采用了 CGLIB 技术的动态代理对象。也就是 Hibernate 中的懒加载技术!等到真正需要用到该对象的时候,才会去创建真正的实例对象。如果 id 值不对,找不到记录的话,就会抛出一个ObjectNotFoundException
异常对象。 -
void update(Object obj)
,实现修改记录有两种方式:- 第一种是必须要先进行查询,再修改对应的属性,最后调用此方法,这才是正确的逻辑。
- 第二种是直接创建对象,指定 id 值,最后调用该方法。这种方法的前提是需要知道 id 值,而且它会一次性更改所有属性,也就是说,如果创建的对象有 null 值,数据库中对应的记录也会被修改成 null 。不推荐使用,而且也不合理啊,不通过查询,怎么会知道 id 值呢?
-
void delete(Object obj)
,实现删除记录也有两种方式:- 第一种是先查询,再修改对应的属性,然后再删除。推荐使用这种方式,因为这种删除方式属于级联删除。什么是级联删除呢?如果要删除一个用户记录,那么关于它的订单记录也就没有必要存储了,一并删除就好,这就属于级联删除。
- 第二种是先创建对象,指定 id 值,再删除,这种只会删除此对象对应的记录,不会进行级联删除。如果有指定的业务需求,也可以使用这种方式。
-
void saveOrUpdate(Object obj)
,此方法会根据有无 id 值,动态选择进行更改或保存。有 id 值就进行更改,没有 id 值就进行保存数据。 -
Query createQuery(String hql)
,该方法返回一个 Query 对象,参数接受的是使用面向对下思想的 Hibernate Query Language 。使用方式如下:
Query q = session.createQuery("from Customer");
List<Customer> list = q.list();
-
Query createSQLQuery(String sql)
,该方法返回一个 Query 对象,参数接收的是 sql 语句,可见 Hibernate 也是可以直接编写 sql 语句的。而且此方法返回的 List 集合的元素是一个Object[]
数组对象,使用方式如下:
SQLQuery q = session.createSQLQuery("select * from cust_customer");
List<Object[]> list = q.list();
Transaction 接口
这是 Hibernate 中进行事务管理的对象,如果用到 Spring 的话,这个工作会交给 Spring 完成。它的核心方法只有两个,分别是:
-
commit()
,提交事务 -
rollback()
,出现了问题,进行回滚
网友评论