Hibernate(2)Hibernate核心类和接口

来源:互联网 发布:c语言第五版 编辑:程序博客网 时间:2024/05/21 11:17

1 Hibernate核心类和接口

这里写图片描述
①configuration类
用处:
- 读取hibernate.cfg.xml
- 管理对象关系映射文件<mapping resource="">
- 加载hibernate的驱动,url,用户……
- 管理hibernate配置信息
②hibernate.cfg.xml
使用getCurrentSession时,进行的配置:
- 本地事务—针对一个数据库的事务
<property name="current_session_context_class">thread</property>
全局事务—跨数据库的事务
<property name="current_session_context_class">jta</property>
③对象关系映射文件
④SessionFactory(会话工厂接口)
- 可以缓存SQL语句和数据(也称为session级缓存)
- 是一个重量级的类,因此需要保证,一个数据库有一个SessionFactory就可以了
- 如果某个应用访问了多个数据库,则要创建多个会话工厂实例;一般是,一个数据库对应一个会话工厂实例
- 通过SessionFactory获取session

/*使用getCurrentSession,更利于事务的控制(多个控制器进行crud操作时),需要在hibernate.cfg.xml中配置<property name="current_session_context_class">thread</property>*/getCurrentSession();  // 获取的是同一个session,使用此方法就可以获取提前分配好的session,不需要再次openSession();openSession(); // 获取一个新的sessionsession.hashCode(); // 唯一标识了一个对象
  • 通过getCurrentSession()获取session,在事务提交后,会自动关闭;通过openSession()获取的session则必须手动关闭,但我们建议两种方式获取session时,都手动关闭。
  • 如果通过getCurrentSession()获取session,进行查询时要事务提交。
    ⑤session 用于实现持久化的接口,主要有以下操作(对应crud操作)
    get/load、save,delete, update

2 getCurrentSession和openSession的区别与联系(Hibernate工具类)

import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.classic.Session;public final class HibernateUtil {    private static SessionFactory sessionFactory = null;    // 线程局部模式    private static ThreadLocal<Session> threadLoacal = new ThreadLocal<Session>();    private HibernateUtil() {}    static {        sessionFactory = new Configuration().configure().buildSessionFactory();    }    // 获取全新的session    public static Session openSession() {        return sessionFactory.openSession();    }    // 获取和线程关联的session    public static Session getCurrentSession() {        Session session = threadLoacal.get();        // 判断是否得到        if(session==null) {            session = sessionFactory.openSession();            // 将session放入threadLocal            threadLoacal.set(session);        }        return session;    }}

3 session的get和load方法区别(相同点:只能通过id查询)

①如果查询不到数据,get不会报错,会返回null;load会抛出异常
表现上的区别:使用get去查询数据,会立即向DB发出查询请求(select …);如果使用load,即时查询到了,返回的是一个代理对象,如果后面没有使用查询结果,不会真的向数据库发出select请求,当程序员使用查询结果时,才真的会发出select请求,这种方式也称为懒加载(默认是开启的)。
通过在Employee.hbm.xml中设置,禁用懒加载:<class name="Employee" lazy="false" table="employee">
*查询方式不同:***load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中去查询;get先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)。
选择原则:如果确定DB中有对象,则使用load;如果不确定有没有,则使用get

4 Transaction(事务)接口

一组数据库操作的集合,它们要么全部成功,要么全部失败,这可以保证数据的一致性,事务具有原子性。
①Transaction是底层的事务实现中抽象出来的接口
②可能是一个jdbc或者jta的事务,这样有利于hibernate在不同执行环境的移植
③hibernate要求显示的调用事务(如果仅仅是查询可以不调用)
调用格式参见:http://blog.csdn.net/u013943420/article/details/70861325#t6

5 Query接口(可以通过id,也可以通过其他属性查询)

Query接口类型的对象可以对数据库操作,它可以使用Hql,Qbc,Qbe和原生SQL对数据库操作,官方推荐使用Hql语句。

Session session = HibernateUtil.getCurrentSession();Transaction ts = null;try {    ts = session.beginTransaction();    // 获取Query引用[这里Employee不是表,而是domain类名; name可以使属性名,也可以是表的字段名]    Query query = session.createQuery("from Employee where name='jiaozl'");    // 通过list方法获取结果    List<Employee> list = (List<Employee>) query.list();    for(Employee e:list) {        System.out.println(e.getName());    }    ts.commit();} catch(Exception e) {    if(ts!=null) {        ts.rollback();    }    throw new RuntimeException(e.getMessage());} finally {    if(session!=null && session.isOpen()) {        session.close();    }}

此外,Criteria接口也可以用于面向对象方式的查询。

Session session = HibernateUtil.getCurrentSession();Transaction ts = null;try {    ts = session.beginTransaction();    Criteria cri = session.createCriteria(Employee.class)            .setMaxResults(2)            .addOrder(Order.desc("id"));    List<Employee> list = cri.list();    for(Employee e:list) {        System.out.println(e.getId() + " " + e.getName() + " " + e.getEmail());    }    ts.commit();} catch(Exception e) {    if(ts!=null) {        ts.rollback();    }    throw new RuntimeException(e.getMessage());} finally {    if(session!=null && session.isOpen()) {        session.close();    }}
0 0
原创粉丝点击