因为SessionFactory是一个重量级对象,最好是只创建一次,所以,将SessionFactory做一个封装,先建立一个工具类把它封装起来.工具类名称设置为HibernateUtils
package net.knight.hibernate.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
/**
* 从hibernate.cfg.xml获取配置文件
* getSessionFactory():获得Session工厂
* getSession():从SessionFactory获得Session
* getTransaction():从Session中获得Transaction
* closeSession():关闭Session
*/
public class HibernateUtils {
private static SessionFactory factory;
/**
* 建立一个static块可以写多条语句.
*/
static {
try {
Configuration cfg = new Configuration().configure();
factory = cfg.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return factory;
}
public static Session getSession() {
return factory.openSession();
}
public static Transaction getTransaction(Session session) {
return session.beginTransaction();
}
public static void closeSession(Session session) {
if(session != null) {
if(session.isOpen()){
session.close();
}
}
}
}
第一课中是使用的Client类来测试Hibernate_first项目,考虑到如果要测试多个类的时候测试不方便,这个改用junit单元测试工具来测试,也可以学习一下junit的使用方法.步骤如下
1.因为测试类最终发布的时候不会打包,所以把这个测试包文件放在项目外面是一个比较明智的选择.也便于管理.首先在项目中建立一个源码目录,目录名称我建立成test.这个目录和src目录平级.
2.在目录中建立测试类路径,我这里设置的类路径和src中的一致.是否一致都可以,没有什么要求.
3.建立测试类,因为是测试Session,所以建立成SessionTest
package net.knight.hibernate.test;
import junit.framework.TestCase;
/**
* junit单元测试,主要对方法进行测试
* 1.继承TestCase方法
* 2.方法名称要以test开头
* 3.测试方法不能含有参数和返回值
*/
public class SessionTest extends TestCase {
// 公共信息初始化可以放到这个方法里.
@Override
protected void setUp() throws Exception {
super.setUp();
}
public void testHello() {
System.out.println("==========SessionTest.testHello===========");
// 断言的使用方法,前面的参数是预期值,后面的参数是实际值,如果预期值不等于实际值就失败了.
this.assertEquals("", "");
}
// 需要销毁的信息放到这里,类似于C中间的析构函数.
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
}
Session有三种状态
1.Transient,new一个对象的时候就是Transient对象,最显著的特点就是在数据库中还没有与之对应的记录.还没有纳入到Session的管理,随时可以被垃圾回收器回收.
2.Persistent,当Transient对象调用save()方法后就成了Persistent对象,这个对象在数据库中是有与之对应的记录的.它纳入的Session的管理,这个对象是不能被垃圾回收器回收的.
3.Detached,当Persistent对象调用了close()等方法的时候就是Detached对象,调用close()方法后,这个对象只是从缓存里被清除掉了,数据库中的记录是不会被清除的.所以这个对象也没有纳入到Session的管理,但是数据库中是有与之对应的记录的,这个对象也随时可以被垃圾回收处理掉.因为没有任何对象引用它了.
4.因为数据库中有与之对应的记录,所以可以调用update()等方法,当Detached对象调用该类方法时,这个对象又变成了Persistent对象了.当Persistent对象再调用delete()方法时这个对象又变成Transient对象了.
Transient--save()-->Persistent--close()-->Detached--update()-->Persistent--delete()-->Transient
package net.knight.hibernate.test;
import java.util.Date;
import net.knight.hibernate.User;
import net.knight.hibernate.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import junit.framework.TestCase;
/**
* junit单元测试
* 1.继承TestCase方法
* 2.方法名称要以test开头
*
*/
public class SessionTest extends TestCase {
public void testSession() {
Session session = null;
Transaction ts = null;
User user = null;
try {
session = HibernateUtils.getSession();
ts = HibernateUtils.getTransaction(session);
// Transient状态
user = new User();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
// Persistent状态.当属性发生改变的时候,hibernate会自动同步数据库
// 生成并执行insert into,此时的数据在缓存中,只是一个快照.
session.save(user);
// 修改user对象后,发生脏数据对比,对数据进行修改
// 生成并执行update,存入数据库.清理缓存
user.setName("王五");
ts.commit();
} catch (RuntimeException e) {
e.printStackTrace();
ts.rollback();
} finally {
HibernateUtils.closeSession(session);
}
// 再修改username,此时就是Detached状态
user.setName("赵六");
try {
// 因为Session已经关闭,则需要重新获取
session = HibernateUtils.getSession();
ts = HibernateUtils.getTransaction(session);
// 获取到session后又转换成Persistent
session.update(user);
ts.commit();
}catch(Exception e) {
e.printStackTrace();
ts.rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
分享到:
相关推荐
Session 负责所有与数据库交互的工作,包括管理持久化对象的生命周期,并通过提供第一级别的高级缓存来确保持久化对象的数据与数据库保持同步。 **2. Session的特点** - **单线程性**: Session 是单线程、非共享的...
`Session`具有短暂的生命周期,通常在一次数据库事务的开始和结束之间创建和关闭。 `Session`具有以下几个关键特性: 1. **非线程安全**:由于`Session`不是线程安全的,因此在多线程环境中,每个线程都应有自己的`...
一级缓存是内置的,随Session生命周期,存储对象实例。二级缓存可选,用于存储类级别的数据,可配置第三方缓存如 Ehcache。缓存管理涉及并发控制和数据过期策略。 总的来说,Hibernate作为流行的ORM框架,提供了...
这种方法简化了代码,但可能导致Session生命周期过长,增加内存压力。 总的来说,理解和熟练运用Hibernate的缓存机制以及Session的管理方式,对于优化应用性能、减少数据库负载至关重要。在实际开发中,开发者应...
然而,一级缓存并不能解决所有问题,因为它的生命周期受限于事务,导致跨事务的数据共享困难。为了解决这个问题,Hibernate引入了二级缓存。二级缓存是进程级或者集群级的,它可以跨多个会话和事务共享数据,从而...
一级缓存是SessionFactory级别的,每个Session在操作数据时,都会将实体对象放入一级缓存,它是线程安全的,但生命周期较短,随着Session关闭,一级缓存中的数据也会被清除。 二级缓存则更像是一种全局性的缓存,它...
6. Session和Transaction:理解Session的生命周期和事务管理,以及它们在实际应用中的最佳实践。 本章作为Hibernate学习的起点,旨在建立对ORM和Hibernate基本概念的理解,后续章节将进一步深入探讨关联映射、缓存...
- **Hibernate in Spring**:Spring框架可以方便地管理Hibernate Session的生命周期,并与其他Spring组件协同工作。 #### 四、总结 本文档不仅是一份Hibernate的学习指南,也是作者多年实战经验的总结。通过阅读这...
**标题解析:**“Hibernate Part 3:核心API和常量配置”指的是一篇关于Hibernate ORM框架的系列教程的第三部分,主要讨论了Hibernate的核心应用程序接口(API)以及相关的常量配置。Hibernate是一个用于Java应用...
- 初始化SessionFactory:在程序启动时,根据配置文件创建SessionFactory对象,它是线程安全的,整个应用生命周期只需要一个。 - 使用Session进行操作:通过SessionFactory获取Session实例,执行CRUD操作(创建、...
二级缓存是SessionFactory级别的,可配置第三方缓存提供商如Ehcache,以共享数据在多个Session之间。 8. **事件和监听器**: Hibernate支持事件驱动编程,例如在对象的持久化、加载、更新等操作前后触发特定的事件...
二级缓存则是SessionFactory级别的,可配置第三方缓存服务如Ehcache,用于存储多个Session间共享的数据。 7. **Events and Listeners**:Hibernate允许注册事件监听器,以便在特定事件(如对象加载、保存、更新或...
- **Session生命周期**: - 打开: 通过SessionFactory创建。 - 关闭: 明确调用close()方法关闭。 - 清除: clear()方法用于释放内存中的对象。 - **Session最佳实践**: - 尽量减少Session的打开时间,避免长时间...
理解Session的工作原理和生命周期对于有效使用Hibernate至关重要。 5. **Criteria查询**:Hibernate提供了Criteria API,一种更面向对象的查询方式,允许开发者动态构建查询,无需编写SQL语句。 6. **HQL...
1. 第一级缓存:Session内部维护的缓存,保存了Session生命周期内的对象,自动管理读写操作。 2. 第二级缓存:可选配置,通过插件如Ehcache实现,跨Session共享,提高性能。 以上就是Hibernate执行持久层访问的基本...
- **生命周期管理**:Session 生命周期的管理非常重要。通常情况下,一个业务请求对应一个 Session。 - **一级缓存**:Session 自带一级缓存功能,这意味着对于同一个 Session 来说,如果两次查询同一个对象,则第二...
- **第三部分**:介绍了一个基于Servlet的Web应用程序案例,演示了如何在实际项目中集成Hibernate。 2. **体系结构** - **概况**:概述Hibernate的架构设计。 - **JMX整合**:介绍如何利用JMX进行监控和管理。 ...
- **Session生命周期管理**: 控制Session的开启和关闭时间。 #### 十六、Hibernate in Spring - **Spring框架与Hibernate的整合**: Spring提供了一种简单的机制来管理和配置Hibernate。 - **优点**: - 事务管理...
2. **Session生命周期管理**:`close()`方法用于关闭当前的`Session`,释放其占用的资源。 **答案选项**:本题为多选题,正确答案为A、B、C、D、F。 #### 六、对象标识相等性 **题目解析:** 1. **Hibernate的一...
4. **Caching**:Hibernate支持二级缓存,通过集成第三方缓存提供商(如 EhCache 或 Infinispan),可以提高数据访问性能,减少对数据库的直接访问。 5. **Query Language**:Hibernate支持两种查询方式,一种是...