首页 > 代码库 > Hibernate

Hibernate

二、Hibernate框架

1、为什么要使用Hibernate框架

 使用JDBC操作数据的缺点

1)重复性工作多    2)代码冗余

n

3)开发效率低      4)代码移植困难

使用Hibernate

1)简化了JDBC 繁琐的编码

2)提高开发效率,提高可维护性

3)便于移植

---------------------------------

举例说明:

JDBC持久化保存用户操作

Connection connection=null;

PreparedStatement pstmt=null;

Class.forName("oracle.jdbc.driver.OracleDriver");

connection=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","system","system");

pstmt=connection.prepareStatment("insert into Users(userId,userName,password) values(seq_user.nextval,?,?)";

pstmt.setString(1,"hzhy");

pstmt.setString(2,"123456");

int rows=pstmt.executeUpdate();

pstmt.close();

connection.close();

 

Hhibernate保存用户操作

session.save(user);

---------------------------------------------------------------------------

 

2、什么是Hibernate框架:Hibernate是一个轻量级的实现数据持久化操作的ORM对象关系映射框架。

1)轻量级:体积小、消耗资源少,是对JDBC进行轻量级的封装

2)持久化:程序数据在瞬时状态和持久状态间转换的过程

3ORM对象关系映射:用于实现面向对象编程语言和关系型数据库之间的数据转换。

    a)编写程序的时候,以面向对象的方式处理数据

    b)保存数据的时候,却以关系型数据库的方式存储

 

3、使用Hibernate的步骤

1)添加Hibernate Jar文件

hibernate3.jar:核心文件

antlr-2.7.6.jar:词法分析

commons-collections-3.1.jar:操作集合

dom4j-1.6.1.jar:解析XML文档

javassist-3.9.0.GA.jar:操作字节码

jta-1.1.jar:事务管理API

slf4j-api-1.7.21.jarSimple Log Framework,简单日志框架(只有接口)

slf4j-log4j12-1.7.21.jar:在slf4jlog4j之间转换的工具,采用的适配器模式

log4j-1.2.17.jar:日志框架

ojdbc6-11.1.0.7.0.jarJDBC驱动包

 

2)编写Hibernate配置文件

3)创建持久化类和映射文件

4)使用Hibernate API实现持久化操作

SessionFactory sf=null;

Session session=null;

Transaction tx=null;

try {

//1.读取配置文件

Configuration config=new Configuration().configure();

//2.创建SessionFactory

sf=config.buildSessionFactory();

//3.创建Session

session=sf.openSession();

//4.开启事务

tx=session.beginTransaction();

//5.持久化操作

session.save(user);

//6.提交事务

tx.commit();

} catch (HibernateException e) {

//6.回滚事务

if(tx!=null&&tx.isActive()){

tx.rollback();

}

e.printStackTrace();

}finally{

//7.关闭Session

session.close();

}

 

4get()load()方法的区别

1)使用get()加载对象会立即执行SQL语句,而使用load()方法加载对象不会立即执行SQL语句,只有当真正访问这个对象(除了OID之外的属性或调用方法)时才真正执行SQL语句

2)使用get()加载对象返回真实的实体类型,所有属性已初始化(从数据库获取相应的值);而使用load()方法加载返回的是代理对象,除了OID(对象标识符)之外,其它的属性都没初始化

3)当不能加载数据时,get()方法会返回null,如果访问OID会报NullPointerExceptionload()方法依然返回依然返回代理对象,访问OID不会报NullPointerException,访问其他属性时会报ObjectNotFoundException

4)使用load()可以实现延迟加载,从而提高性能。所以在不需要访问对象的时候,可以优先考虑使用load()方法

 

5openSession()getCurrentSession()的区别

1openSession()每次都获取新的Session对象,getCurrentSession()获取当前Session上下文中已有的对象,如果没有,才创建一个新的Session对象

2getCurrentSession()方法获取Session对象需要在Hibernate配置文件中配置管理session的上下文,如下所示:

     <property name="hibernate.current_session_context_class">thread</property>

3getCurrentSession()方法获取Session对象,在事务提交时会自动关闭Session对象。

 

6.Hibernate辅助工具类:用于获取Session和关闭Session

1)初始化一个ThreadLocal对象,ThreadLocal对象有get()set()方法

2ThreadLocal对象的get()方法根据当前线程返回其对应的线程内部变量,即Session对象,保证每个线程都有自己的独立的Session对象,避免了多线程情况下共享数据库连接造成的不安全。

3)通过ThreadLocal类,可以在用户同一次请求过程中,实现事务操作,并且解决了多线程并发的线程同步问题,为同一个变量在每一个线程中都保留自己的副本。

 

三、Hibernatejava对象的三种状态及其相互转换

1Java对象的三种状态

1)瞬时态(Transient,自由状态):自由地游荡于session之外,不归于Hibernate缓存管理

2)持久态(Persitent):已经被保存进数据库的实体对象

3)游离态(Detached,脱管状态):和自由态的区别在于有对象标识符

2、瞬时态对象的特点

(1) 不和 Session 实例关联

(2) 在数据库中没有关联的记录

3、持久态对象的特点:

(1) Session 实例关联,归于Hibernate缓存管理

(2) 在数据库中有关联的记录

4、游离态对象的特点

(1) 本质上和瞬时对象相同

(2) 只是比瞬时态对象多了一个对象标识符id(对应数据库记录主键列的值)

5、三种状态之间的转换

1)瞬时态转换为持久态:通过 Session save() saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。

2)持久态转换为瞬时态:

3)持久态转换为游离态:当执行 close() clear(),evict() 之后,持久对象会变为脱管对象。

4)游离态转换为持久态:通过 Session update(),saveOrUpdate() lock() 等方法,把脱管对象变为持久对象。

5)游离态转换为瞬时态

6、脏检查及刷新缓存机制

1)脏检查

2)刷新缓存机制

7、更新数据的方法

1update

2saveOrUpdate

3merge:复制一个对象的状态到具有对象标识符的对象中

Hibernate