Hibernate 学习笔记-1-2(测试Hibernate中session的生命周期以及CRUD)
2008-02-18 13:52
671 查看
由于这册测试使用的是JUnit,所以在开始之前,先说一下JUnit 的注意事项:
Junit简介:
* 编写类XXXXTest,需要继承TestCase
* 编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
public void testHello( ) { }
* 最好单独建立source目录存放测试类
下面开始:
1.新建了一个Hibernate-Session的Java Project,还是引用上次笔记(1-1)中所创建的数据库hibernate_simple,所以像User,java,hibernate.cfg.xml,User.hbm.xml的内容都不需要改变。为了后面测试减少重复的代码,我把Hibernate稍微封装了一下,编写了一个HibernateUtils.java,源码如下(采用了一个简单的单例模式):
package com.codedestiny.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils ...{
private static SessionFactory sessionFactory;
private HibernateUtils() ...{}
static ...{
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() ...{
return sessionFactory;
}
public static Session getSession() ...{
return sessionFactory.openSession();
}
public static void closeSession(Session session) ...{
if(session != null) ...{
if(session.isOpen()) ...{
session.close();
}
}
}
}
2.新建了一个source-folder,名叫test,用来储存JUnit测试实例,先来一张项目的完整包图吧:
再上该folder下的SessionTest.java:(具体需要注意的问题已在注释中提到,尤其要关注HIbernate的Lazy特性以及Transient,Persistent,Detached三种状态的转换)
package com.codedestiny.hibernate;
import java.util.Date;
import org.hibernate.Session;
import junit.framework.TestCase;
public class SessionTest extends TestCase ...{
public void testSaveData() ...{
Session session = null;
//Transient对象
User user = new User();
try ...{
//得到session
session = HibernateUtils.getSession();
//开启事务
session.beginTransaction();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent对象
session.save(user);
//persistent状态的对象的属性发生的改变,Hibernate会自动和数据库同步
user.setName("李四");
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}finally ...{
HibernateUtils.closeSession(session);
}
//detached对象
user.setName("王五");
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//persistent对象
session.update(user);
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}finally ...{
HibernateUtils.closeSession(session);
}
}
public void testReadByGetMethod() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//get会马上发出sql进行执行查询
User user = (User)session.get(User.class, "402881e4182ae4da01182ae4e1d00001");
System.out.println("User Name = " + user.getName());
//此时为persistent对象,所以可以自动同步到数据库中
user.setName("王二");
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
}
public void testReadByLoadMethod() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//load方法实现了Lazy(延迟加载或懒加载),所以不会马上发出sql
//只有真正使用时才会发出sql,Lazy是hibernate的重要特性
User user = (User)session.load(User.class, "402881e4182ae4da01182ae4e1d00001");
System.out.println("user name=" + user.getName());
System.out.println("password=" + user.getPassword());
//此时为persistent对象,所以可以自动同步到数据库中
user.setName("王三");
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
}
public void testUpdate() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//此时为Transient对象
User user = new User();
user.setId("402881e4182ae4da01182ae4e1d00001");
user.setName("abc");
session.update(user);
//此时为persistent对象
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
}
public void testDelete() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//此时为Transient对象
User user = new User();
user.setId("402881e4182ae4da01182ae4e1d00001");
session.delete(user);
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
//此时为Transient对象
}
}
Transient对象具有的特征:
* 不处于session缓存中,不被任何一个session实例关联
* 在数据库中没有相应的记录
persistent对象具有的特征:
* 位于一个Session的缓存中,持久对象总是和一个session实例关联
* 持久对象和数据库中的记录对应
* 持久对象的变化会自动同步到数据库
detached对象具有的特征:
* 不再位于session的缓存中,不被session关联
* detached对象是由persistent对象转变过来的,因此数据库中会存在一条记录与之对应
Junit简介:
* 编写类XXXXTest,需要继承TestCase
* 编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
public void testHello( ) { }
* 最好单独建立source目录存放测试类
下面开始:
1.新建了一个Hibernate-Session的Java Project,还是引用上次笔记(1-1)中所创建的数据库hibernate_simple,所以像User,java,hibernate.cfg.xml,User.hbm.xml的内容都不需要改变。为了后面测试减少重复的代码,我把Hibernate稍微封装了一下,编写了一个HibernateUtils.java,源码如下(采用了一个简单的单例模式):
package com.codedestiny.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils ...{
private static SessionFactory sessionFactory;
private HibernateUtils() ...{}
static ...{
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory() ...{
return sessionFactory;
}
public static Session getSession() ...{
return sessionFactory.openSession();
}
public static void closeSession(Session session) ...{
if(session != null) ...{
if(session.isOpen()) ...{
session.close();
}
}
}
}
2.新建了一个source-folder,名叫test,用来储存JUnit测试实例,先来一张项目的完整包图吧:
再上该folder下的SessionTest.java:(具体需要注意的问题已在注释中提到,尤其要关注HIbernate的Lazy特性以及Transient,Persistent,Detached三种状态的转换)
package com.codedestiny.hibernate;
import java.util.Date;
import org.hibernate.Session;
import junit.framework.TestCase;
public class SessionTest extends TestCase ...{
public void testSaveData() ...{
Session session = null;
//Transient对象
User user = new User();
try ...{
//得到session
session = HibernateUtils.getSession();
//开启事务
session.beginTransaction();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//persistent对象
session.save(user);
//persistent状态的对象的属性发生的改变,Hibernate会自动和数据库同步
user.setName("李四");
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}finally ...{
HibernateUtils.closeSession(session);
}
//detached对象
user.setName("王五");
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//persistent对象
session.update(user);
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}finally ...{
HibernateUtils.closeSession(session);
}
}
public void testReadByGetMethod() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//get会马上发出sql进行执行查询
User user = (User)session.get(User.class, "402881e4182ae4da01182ae4e1d00001");
System.out.println("User Name = " + user.getName());
//此时为persistent对象,所以可以自动同步到数据库中
user.setName("王二");
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
}
public void testReadByLoadMethod() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//load方法实现了Lazy(延迟加载或懒加载),所以不会马上发出sql
//只有真正使用时才会发出sql,Lazy是hibernate的重要特性
User user = (User)session.load(User.class, "402881e4182ae4da01182ae4e1d00001");
System.out.println("user name=" + user.getName());
System.out.println("password=" + user.getPassword());
//此时为persistent对象,所以可以自动同步到数据库中
user.setName("王三");
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
}
public void testUpdate() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//此时为Transient对象
User user = new User();
user.setId("402881e4182ae4da01182ae4e1d00001");
user.setName("abc");
session.update(user);
//此时为persistent对象
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
}
public void testDelete() ...{
Session session = null;
try ...{
session = HibernateUtils.getSession();
session.beginTransaction();
//此时为Transient对象
User user = new User();
user.setId("402881e4182ae4da01182ae4e1d00001");
session.delete(user);
session.getTransaction().commit();
}catch(Exception e) ...{
e.printStackTrace();
session.getTransaction().rollback();
}
finally ...{
HibernateUtils.closeSession(session);
}
//此时为Transient对象
}
}
Transient对象具有的特征:
* 不处于session缓存中,不被任何一个session实例关联
* 在数据库中没有相应的记录
persistent对象具有的特征:
* 位于一个Session的缓存中,持久对象总是和一个session实例关联
* 持久对象和数据库中的记录对应
* 持久对象的变化会自动同步到数据库
detached对象具有的特征:
* 不再位于session的缓存中,不被session关联
* detached对象是由persistent对象转变过来的,因此数据库中会存在一条记录与之对应
相关文章推荐
- Hibernate学习笔记之Session-API实现CRUD以及get&load&merge方法
- 测试Hibernate中session的生命周期以及CRUD
- hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
- 【学习笔记】Hibernate实例多对多映射以及测试
- 【转】hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作
- Hibernate 学习笔记-1-3(Hibernate的基本映射以及几种主键生成策略的测试)
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
- 【学习笔记】Hibernate中对象的状态和转换以及Session的主要方法总结
- 安全测试学习笔记一(Cookie&Session)
- Hibernate学习笔记:session操作对象
- 【Hibernate学习笔记】Session清空缓存与清理缓存
- 第102讲:通过案例解析Akka中的Actor运行机制以及Actor的生命周期学习笔记
- 【JavaEE学习笔记】Hibernate_01_配置,核心,Session,事物,Jboss Tools
- [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期
- 框架学习之Hibernate 第三节 session接口以及get/load/persist方法
- 测试Servlet生命周期学习笔记
- hibernate的数据状态以及session的CRUD方法
- Hibernate学习笔记:session操作对象
- Hibernate学习--Session生命周期的不同状态