本文共 2531 字,大约阅读时间需要 8 分钟。
Hibernate 是基于javaEE平台的一种开放源代码的ORM框架技术。
是对JDBC的封装,向业务层提供了更加面向对象的API,而操作的对象
是域模型对象(POJO)。Hibernate 要求对javabean提供一个不带参数的构造方法
Configuration 接口:用于Hibernate配置,在Hibernate启动的时候读取配置文件,创建一个SessionFactory对象。
SessionFactory 接口:用来产生Session对象,一个SessionFactory对象代表一个数据库连接。他是线程安全的,他所拥有的信息(二级缓存,不是必须的)被客户用户所共享。
Session 接口:用于对数据进行持久化操作。相当于持久化对象在内存中的一个缓冲区(一级缓存,必须的)。他是线程不安全的,hibernate会自动检测缓冲区中持久化对象的是否已经被改变并及时进行刷新,以保证数据的同步性。
Transaction 接口:是Hibernate API通过操作底层事务(如:JDBC事务管理、JTA)来达到管理事务的目的。
Query/Criteria 接口:提供对数据的查询方法。
五个接口之间的关系是:
Configuration ------> SessionFactory -------> Session -------->【Transaction、Query / Criteria】
hibernate.cfg.xml配置模型类对象关系映射文件Person.hbm.xml com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test root root org.hibernate.dialect.MySQLDialect true update
关键代码://构建配置对象,加载配置文件信息 Configuration cfg = new Configuration().configure();//创建SessionFactory对象SessionFactory factory = cfg.buildSessionFactory();//获取数据操作对象sessionSession session = factory.openSession();//获得事务对象Transaction tx = session.beginTransaction();//利用session对象进行数据查询(利用OID进行查询)Object o1 = session.get(Person.class,new Integer(1));Object o2 = session.load(Person.class,new Integer(2));//利用HQL进行数据查询Query query = session.createQuery(“from Person”);List list = query.list();Iterate iterate = query.iterate();
session.get() 他首先会查询一级缓存,没有的话二级缓存,最后再查询数据库。 如果没有就返回null,是一种立即加载。 session.load() 他首先查询一级缓存,如果没有创建一个代理对象。在实际使用的时候没有就再去 查询二级缓存,最后再查询数据。再没有就会抛出异常。load()方法认为要查询的 对象一定存在,所以使用了代理对象来达到延迟加载的目的。 |
query.list() 首先查询一级缓存,没有的话二级缓存,最后再查询数据库。 他返回的是完整数据对象的集合,没有就返回null.立即加载。 产生的sql:select * from person; query.iterate() 首先查询一级缓存,没有的话二级缓存,最后再查询数据库。 他返回的是数据对象的OID集合,当真正使用的时候,他在 针对每一个对象进行数据查询此时返回的才是完整的数据对象。 都没有就返回null,是一种延迟加载。 产生的sql: 首次返回OID集合 select id from person; 真正使用时在查询每个对象select p.id,p.name from person p where id = 1; |
通过上面的比较发现:
使用了get()与list()会立即返回完整对象,所以当session关闭后可以直接使用
而load()与iterate()则分别通过生成代理对象与返回OID对象集合的方式达到延迟
加载的目的。当session关闭后再去使用这些对象,由于他们这时才会真的去查询出完整
对象,所以就会抛出session关闭的异常。再有使用了iterate将会产生多条sql,进行
影响性能.
转载地址:http://xhxei.baihongyu.com/