您的位置:首页 > 其它

Hibernate(四)之对象状态及一级缓存

2017-04-07 20:46 302 查看

一、Hibernate中的对象状态

  1.1、瞬时态(临时态)

    没有与Hibernate产生关联

    与数据库中的记录没有产生关联(有关联就是与数据库中表的id相对应)   

      获得:一般都只直接创建(new)
      瞬时态 转换 持久态
        一般操作:save方法、saveOrUpdate
      瞬时态 转换 脱管态
        一般操作:通过setId方法设置数据

   1.2、持久态

    Hibernate有关联

    对象有id

      获得:
        查询操作:get、loat、createQuery、createCriteria 等 获得都是持久态【】
        执行save之后持久态
        执行update之后持久态
      持久态 转换 瞬时态
        官方规定执行delete() --民间:删除态
      持久态 转换 脱管态
        session没有记录
        session.close () 关闭
        session.clear() 清除所有
        session.evict(obj) 清除指定的PO对象

  1.3、游离态(脱管态)

    没有与Hibernate产生关联

    对象有ID

      获得:
        创建、并设置OID的
        通过api获得
      脱管态 转换 瞬时态
        手动去除OID,设置成默认值
      脱管态 转换 持久态
        一般操作:update()、saveOrUpdate

  1.4、在代码中去查看三种状态

    

import java.util.List;

import org.hibernate.Session;
import org.junit.Test;

import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//其他API (大部分都是了解)
public class Demo1 {
@Test
//1. evict 将缓存中的对象移除.
//2. clear 清空1级缓存
public void fun1(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = (User) session.get(User.class, 1);

session.clear();

User u2 = (User) session.get(User.class, 1);

//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
@Test
//3 refresh 刷新 => 强制刷新缓存中的对象 => (可以用来解决缓存与数据库数据不同步的问题)
public void fun2(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = (User) session.get(User.class, 1);

session.refresh(u1); //将缓存中的对象立刻与数据库同步,会再发送一个sql语句
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
@Test
//4 flush 对比快照,并提交缓存对象
public void fun3(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = (User) session.get(User.class, 1);

//u1.setName("zhangsan");

session.flush();// 立刻提交session缓存中的对象到数据库

//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}

@Test
// 代理主键=> native
//5.1 aveOrUpdate方法
//saveOrUpdate 可以同时完成保存或更新操作
//主键为空=>save
//主键有值=> update
public void fun4(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User();
u.setId(99);
u.setName("jack");
u.setPassword("1234");

session.saveOrUpdate(u);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}

// 自然主键=> assigned
//5 update 与 saveOrUpdate方法
//saveOrUpdate 可以同时完成保存或更新操作
//主键为空=> 报错,因为无论是save还是update 都必须指定id
//主键有值=> 先会根据主键查询数据库.
// 数据库中存在=> 执行update
// 数据库中不存在=> 执行insert
@Test
public void fun5(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User();
u.setId(88);
u.setName("jack01");
u.setPassword("1234");

session.saveOrUpdate(u);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}

@Test
//在我们使用Hibernate时候,注意要避免出现,两个相同的ID对象.放入一级缓存的情况.
public void fun6(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = (User) session.get(User.class, 1);// 持久化,缓存中存在

session.evict(u); // 游离态,缓存中不存在

User u2 = (User) session.get(User.class, 1);// 持久化,缓存中存在

session.update(u); // 将U重新变为持久化状态,缓存中存在
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 游离状态
}
}


testSessionApi

  

  

    

    

    

    

  

    

      

    

    

    

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: