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(); }}
- Hibernate(2)Hibernate核心类和接口
- hibernate的核心类和接口(2)
- Hibernate-- (二)核心类和接口
- Hibernate核心接口和类
- Hibernate核心接口和类
- hibernate核心类和接口
- Hibernate核心接口和类
- Hibernate核心接口和类
- Hibernate核心类和接口
- Hibernate核心类和接口
- Hibernate(三):Hibernate核心类,接口
- Hibernate的核心类和接口
- Hibernate的核心类和接口
- Hibernate核心类和接口详细介绍
- hibernate的核心类和接口
- hibernate的核心类和接口
- 【SSH】Hibernate:核心类和接口
- Hibernate的核心接口和类
- [java]使用httpclient4.5.3设置fiddler代理方法
- cksum与md5sum实现文件校验
- 利用PHPMailer发送邮件
- SharedPreferences保存文件工具类
- mybatis的sql 执行报错:Parameter index out of range (4 > number of parameters, which is 3)
- Hibernate(2)Hibernate核心类和接口
- yum install error – GPG key retrieval failed
- grails 记录
- 大数据工程师需要的东西
- angular.js 错误:Error: [$injector:modulerr] 原因
- C#使用UdpClient发送和接收UDP数据示例
- 二叉排序和二叉查找
- log4j.properties配置详解
- git [packet_write_wait connection to xx.xx.xx.xx Broken pipe]解决办法