这里先做简单的总结,主要是梳理Hibernate框架最基本的知识。我把它和JPA对比学习,发现很多相似之处,基本上JPA有的,Hibernate都会有。是不是可以这么认为,Hibernate是照着JPA的标准制定的呢?具体看下面的介绍吧。
2.1Hibernate流程
简单介绍Hibernate 操作数据库的一个流程,都是可见的使用规范,比较粗糙哦。
2.2核心配置
JPA开发需要persistence.xml配置,Hibernate开发需要hibernate.cfg.xml配置。经过仔细对比,发现内容都是一样的,大体可以分为4部分:
2.3Hibernate的核心接口
2.3.1 Configuration
Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例。
2.3.2 SessionFactory
线程安全。
2.3.3 Session
非线程安全。
Session接口是Hibernate向应用程序提供操作数据库的最主要接口,提供了最基本的保存,更新,删除,加载Java对象的方法。(这里可以联想一下JPA的实体管理器)
Session的特定方法能使对象从一个状态转换到另一个状态(JPA的状态转换是由实体管理器实现的)。
关于实体的生命周期,JPA是4个,在Hibernate中的实体状态是3个(没有销毁状态(Removed)),也有说是4个的,我根据在源码中调用方法,Hibernate中没有removed这个方法,所以判断实体只有3个状态。
2.3.4 Transation
Transaction是Hibernate中进行事务操作的接口,是对实际事务实现的一个抽象,这些事务包括JDBC事务、JTA中的UserTransaction,甚至可以是CORBA事务。为了让开发者能够使用一个统一的操作界面所以进行了这样的接口设计。
事务对象通过Session创建。
Transaction ts = session.beginTransaction(); |
2.3.5 Query
用来执行HQL。
JPA的Query返回值是List类型,方法是getResultList()。Hibernate的Query返回值是List类型,方法是list()。
2.4事务
2.4.1基于JDBC的事务
JDBC的事务周期限于Connection的生命周期之内。,对于基于JDBC Transaction的Hibernate事务管理机制而言,事务管理是在Session所依托的JDBCConnection中实现,事务周期限于Session的生命周期。
2.4.2基于JTA的事务
JTA事务管理则由JTA容器实现。JTA容器对当前加入事务众多的Connection进行调度,实现事务性要求。
JTA的事务周期可横跨多个JDBCConnection生命周期。同样的,对于基于JTA事务的Hibernate而言,JTA事务横跨多个Session生命周期。
2.5HQL
2.5.1用法
1.参数查询
- 按参数名称绑定:
Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”); query.setString(“customername”,name); query.setInteger(“customerage”,age); |
- 按参数位置绑定
Query query=session.createQuery(“from User user where user.name=? and user.age =? ”); query.setString(0,name); query.setInteger(1,age); |
- setParameter()方法
String hql=”from User user where user.name=:customername ”; Query query=session.createQuery(hql); query.setParameter(“customername”,name,Hibernate.STRING); |
- setProperties()方法
Customer customer=new Customer(); customer.setName(“pansl”); customer.setAge(80); Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”); query.setProperties(customer); |
- setEntity()方法
Customer customer=(Customer)session.load(Customer.class,”1”); Query query=session.createQuery(“from Order order where order.customer=:customer”); query. setEntity(“customer”,customer); List list=query.list(); |