通过Junit测试来观察Hibernate的 transient ,persisent,detached

package joeho.blog.test;

import java.util.Date;
import java.util.List;

import joeho.blog.domain.HibernateUtils;
import joeho.blog.domain.User;
import junit.framework.TestCase;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author joeho
 *
 */
public class SessionTest extends TestCase {

 public void testSave(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //transient
   user = new User();
   user.setName("ZHANGSAN");
   user.setPassword("aaaa");
   user.setRegistDate(new Date());
   user.setExpireDate(new Date());
   
   //prisistens
   session.save(user);
   
   user.setName("wangwu"); 
   
   //可以显示的调用update方法,但是处于持久状态调用update没有什么意义
   //session.update(user);
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached
 }
 
 public void testSave2(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //transient
   user = new User();
   user.setName("ZHANGSAN");
   user.setPassword("aaaa");
   user.setRegistDate(new Date());
   user.setExpireDate(new Date());
   
   //prisistens
   session.save(user);
   
   user.setName("wangwu"); 
   
   //可以显示的调用update方法,但是处于持久状态调用update没有什么意义
   //session.update(user);
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached
  user.setName("wangmazi");
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //将detached的对象重新纳入session管理
   session.update(user);
   tx.commit();
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
 }
 
 public void testGetUser(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //transient
   
   //prisistens
   user=(User)session.get(User.class, 1);
   System.out.println(user.getName());
   user.setName("lisi");
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached  
 }
 
 public void testGetUser2(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //transient
   
   //prisistens
   user=(User)session.get(User.class, 3);
   System.out.println(user.getName());
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached  
 }
 public void testLoad(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //transient   
   //prisistens
   //支持延迟加载,此处user的值返回的是cglib的一个代理对象
   user=(User)session.load(User.class, 1);
   //只有在访问它的时候才会执行查询语句
   System.out.println(user.getName());
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached  
 }
 
 public void testLoad2(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //transient
   
   //prisistens
   //支持延迟加载,此处user的值返回的是cglib的一个代理对象
   //采用load查询不存在的语句,会抛出ClassNotFontException异常
   user=(User)session.load(User.class, 5);
   //只有在访问它的时候才会执行查询语句
   System.out.println(user.getName());
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached  
 }
 /**
  * 建议采用先加载再删除
  *
  */
 public void testDelete(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //transient
   
   //prisistens   
   //支持延迟加载,此处user的值返回的是cglib的一个代理对象
   //采用load查询不存在的语句,会抛出ClassNotFontException异常
   user=(User)session.load(User.class, 2);
   //只有在访问它的时候才会执行查询语句
   System.out.println(user.getName());
   session.delete(user);   
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached  
 }
 
 public void testDelete2(){
  Session session = null;
  Transaction tx = null;
  User user = null;
  try{
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   //手动构造detached对象
   user = new User();
   user.setId(1);
   session.delete(user);
   
// hibernate可以改成只更新关联的数据,其他的更新为NULL
//一般的更新建议先load,或get再更新
//   user.setName("wangmazi");
//   session.update(user);
   tx.commit();   
  }catch(Exception e){
   tx.rollback();
  }finally{
   HibernateUtils.closeSession(session);
  }
  //detached  
 }
 
 public void testQuery(){
  Session session=null;
  Transaction tx = null;
  
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   Query query = session.createQuery("from User");
   query.setFirstResult(0);
   query.setMaxResults(2);
   
   List<User> list = query.list();
   for(User user:list){
    System.out.println("user name:"+user.getName()+"/npassword:"
      +user.getPassword()+"/nregistdate:"+user.getRegistDate());
   }
   tx.commit();
  } catch (Exception e) {   

   e.printStackTrace();
  }
 }
}

 

 

进一步通过测试Many2One来观察

package joeho.blog.test;

import joeho.blog.domain.Department;
import joeho.blog.domain.Employee;
import joeho.blog.domain.HibernateUtils;
import junit.framework.TestCase;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class Many2oneTest extends TestCase {

 public void testSave1(){
  Session session=null;
  Transaction tx = null;
  
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   Department department = new Department();
   department.setName("开发部");
   
   Employee emp1 = new Employee();
   emp1.setName("张三");
   emp1.setDepartment(department);
   
   Employee emp2 = new Employee();
   emp2.setDepartment(department);
   emp2.setName("李四");
   
   //当在多的一端没有配置casecade关系时,Hibernate在清理缓存时
   //由于department对象不是持久对象,此处会报
   //ObjectTransientException错误   
   session.save(emp1);
   session.save(emp2);
   
   tx.commit();
  } catch (Exception e) {   

   e.printStackTrace();
  }
 }
 
 public void testSave2(){
  Session session=null;
  Transaction tx = null;
  
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   Department department = new Department();
   department.setName("开发部");
   session.save(department);
   
   Employee emp1 = new Employee();
   emp1.setName("张三");
   emp1.setDepartment(department);
   
   Employee emp2 = new Employee();
   emp2.setDepartment(department);
   emp2.setName("李四");
   
   //当在多的一端没有配置casecade关系时,Hibernate在清理缓存时
   //由于department对象通过session.save(),是持久对象,此处不会报
   //ObjectTransientException错误   
   session.save(emp1);
   session.save(emp2);
   
   tx.commit();
  } catch (Exception e) {   

   e.printStackTrace();
  }
 }
 
 public void testSave3(){
  Session session=null;
  Transaction tx = null;
  
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   Department department = new Department(); 
   department.setName("测试部");
   
   Employee emp1 = new Employee();
   emp1.setName("张三");
   emp1.setDepartment(department);
   
   Employee emp2 = new Employee();
   emp2.setDepartment(department);
   emp2.setName("李四");
   
   //当在多的一端有配置casecade关系时,Hibernate在清理缓存时
   //由于department对象是持久对象,此处不会报
   //ObjectTransientException错误   
   session.save(emp1);
   session.save(emp2);
   
   tx.commit();
  } catch (Exception e) {   

   e.printStackTrace();
  }
 }
 
 public void testLoad(){
  Session session=null;
  Transaction tx = null;
  
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   Employee emp = (Employee)session.load(Employee.class, 3);
   System.out.println("department id="+emp.getDepartment().getName());
   
   tx.commit();
  } catch (Exception e) {   

   e.printStackTrace();
  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值