Hibernate 学习笔记-1-2(测试Hibernate中session的生命周期以及CRUD)

由于这册测试使用的是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对象转变过来的,因此数据库中会存在一条记录与之对应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值