hibernate

hibernate的测试三种状态的案例

/**
 * @author weidan       2013-2-2 上午10:10:17
 * remark: 对三种状态进行一个认知
 */
@Test
public void Test1(){
      Session session = null;
      Transaction transaction = null;
      try {
          session = HibernateSessionUtil.getSession();
          transaction =  session.beginTransaction();
          User user = new User();
          user.setUname("weidan");
          user.setUpassword("weidan");
          //在此之前对象处于瞬时状态,原因是在数据库中没有持久化标识与之对应,而且此时user对象没有纳入session管理
          
          session.save(user);
          //在这个地方user对象处于持久化状态,原因是数据库中存在与之对应的持久化标识,而且user对象已经纳入了session的管理
          
          transaction.commit();
          //在这里对象处于托管状态,原因是数据库中有与之相对应的持久化标识,但是此时的user没有纳入session的管理
    } catch (HibernateException e) {
        if(transaction.isActive()){
            transaction.rollback();
        }
    }finally{
            HibernateSessionUtil.closeSession(session);
    }    
}


/**
 * @author weidan       2013-2-2 上午10:14:17
 * remark:  对持久化状态的进一步认识
 * Hibernate: insert into user (uname, upassword) values (?, ?)
 * Hibernate: update user set uname=?, upassword=? where uid=?
 */
@Test
public void Test2(){
      Session session = null;
      Transaction transaction = null;
      try {
          session = HibernateSessionUtil.getSession();
          transaction =  session.beginTransaction();
          User user = new User();
          user.setUname("weidan");
          user.setUpassword("weidan");
          //在此之前对象处于瞬时状态,原因是在数据库中没有持久化标识与之对应,而且此时user对象没有纳入session管理
          
          session.save(user);
          //在这个地方user对象处于持久化状态,原因是数据库中存在与之对应的持久化标识,而且user对象已经纳入了session的管理
          
          user.setUname("dange");
          //对象进入持久化状态,那么user对象的任何的改变,session都会发出sql语句
          
          transaction.commit();
          //在这里对象处于托管状态,原因是数据库中有与之相对应的持久化标识,但是此时的user没有纳入session的管理
    } catch (HibernateException e) {
        if(transaction.isActive()){
            transaction.rollback();
        }
    }finally{
            HibernateSessionUtil.closeSession(session);
    }    
}


/**
 * @author weidan       2013-2-2 上午10:28:24
 * remark:
 * Hibernate: select user0_.uid as uid0_0_, user0_.uname as uname0_0_, user0_.upassword as upassword0_0_ from user user0_ where user0_.uid=?
 * Hibernate: update user set uname=?, upassword=? where uid=?
 */
@Test
public void Test3(){
      Session session = null;
      Transaction transaction = null;
      try {
          session = HibernateSessionUtil.getSession();
          transaction =  session.beginTransaction();
          User user = new User();
          
            user = (User) session.get(User.class, 15);
          
           user.setUname("hah");
           System.out.println(user.getUname());
          
           //执行了update语句,说明当调用get方法的时候,纳入了session管理,对象进入了持久化状态
           
          transaction.commit();
    } catch (HibernateException e) {
        if(transaction.isActive()){
            transaction.rollback();
        }
    }finally{
            HibernateSessionUtil.closeSession(session);
    }    
}

/**
 * @author weidan       2013-2-2 上午10:34:39
 * remark: hibernate 比较智能化,因为session具备了一级缓存。就是session缓存,对于同一个session中具有缓存作用
 * Hibernate: select user0_.uid as uid0_0_, user0_.uname as uname0_0_, user0_.upassword as upassword0_0_ from user user0_ where user0_.uid=?
 */
@Test    
public void Test4(){
      Session session = null;
      Transaction transaction = null;
      try {
          session = HibernateSessionUtil.getSession();
          transaction =  session.beginTransaction();
          User user = new User();
          user = (User) session.get(User.class, 15);
          user.setUname("weidan");
           //因为数据库中的username的相对应的记录值是weidan,一级缓存的原因,这个就不发送update语句,所以有利于提高效率
          transaction.commit();
    } catch (HibernateException e) {
        if(transaction.isActive()){
            transaction.rollback();
        }
    }finally{
            HibernateSessionUtil.closeSession(session);
    }    
}

/**
 * @author weidan       2013-2-2 上午10:45:17
 * remark: 用load获取值可以延迟加载,要用的时候在到数据库去取值
 */
@Test
public void Test5(){
      Session session = null;
      Transaction transaction = null;
      try {
          session = HibernateSessionUtil.getSession();
          transaction =  session.beginTransaction();
          User user = new User();
          user = (User) session.load(User.class, 16);
           //因为数据库中的username的相对应的记录值是weidan,一级缓存的原因,这个就不发送update语句,所以有利于提高效率
          System.out.println(user.getUname());
          transaction.commit();
    } catch (HibernateException e) {
        if(transaction.isActive()){
            transaction.rollback();
        }
    }finally{
            HibernateSessionUtil.closeSession(session);
    }    
}


@Test
public void Test6(){
      Session session = null;
      Transaction transaction = null;
      try {
          session = HibernateSessionUtil.getSession();
          transaction =  session.beginTransaction();
          User user = new User();
          user = (User) session.get(User.class, 16);
           //因为数据库中的username的相对应的记录值是weidan,一级缓存的原因,这个就不发送update语句,所以有利于提高效率
          System.out.println(user.getUname());
          transaction.commit();
    } catch (HibernateException e) {
        if(transaction.isActive()){
            transaction.rollback();
        }
    }finally{
            HibernateSessionUtil.closeSession(session);
    }    
}

 

posted @ 2013-02-01 11:21  虎猫  阅读(212)  评论(0编辑  收藏  举报