您的位置:首页 > 数据库

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对象转变过来的,因此数据库中会存在一条记录与之对应
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐