Hibernate-一级缓存

/**
 * 1、一级缓存的生命周期
 *     一级缓存在session中存放,只要打开session,一级缓存就存在了,当session关闭的时候,一级缓存就不存在了
 * 2、一级缓存是依赖于谁存在的
 *     依赖于session存在的
 * 3、怎么样把数据存放到一级缓存中
 *     利用session.get、update、save
 * 4、怎么样从一级缓存中获取数据
 *     利用session.get方法可以获取数据
 * 5、怎么样把缓存中的数据同步到数据库
 *     * 只要是一个持久化状态的数据就在一级缓存中
 *     * 利用session.flush方法
 * 6、怎么样把数据库的数据同步到一级缓存中
 *     session.reflesh方法   只能同步一个对象
 * 7、一级缓存的特性
 *    也叫session级别的缓存
 *    session中存放私有数据
 *    可以通过新建session和从当前线程中获取session保证数据的安全性
 * 8、从一级缓存中清楚某一个对象
 *    session.evcit方法  并且把一个对象从持久化状态转化成脱管状态
 * 9、清空一级缓存中所有的数据
 * @author Administrator
 *
 */
public class OneCacheTest {
	private static SessionFactory sessionFactory;
	static{
		Configuration configuration = new Configuration();
		//加载配置文件
		configuration.configure("cn/itcast/hibernate0909/session/hibernate.cfg.xml");
		//采用了工厂模式创建sessionFactory
		sessionFactory = configuration.buildSessionFactory();
	}
	/**
	 * session.get方法
	 *     * 通过该方法得到的对象是一个持久化对象
	 *     * 通过该方法可以把该对象存放到一级缓存中(session缓存中)
	 */
	@Test
	public void testGet(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = (Classes)session.get(Classes.class, 1L);
		session.get(Classes.class, 1L);
		transaction.commit();
	}
	
	/**
	 * session.save方法
	 *    *  可以把一个对象变成持久化状态的对象
	 *    *  可以把一个对象放入到一级缓存中
	 */
	@Test
	public void testSave(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = new Classes();
		classes.setCname("极品班");
		classes.setDescription("极品人士:例如干露露");
		session.save(classes);
		Classes classes2 = (Classes)session.get(Classes.class, classes.getCid());
		transaction.commit();
	}
	
	/**
	 * session.update方法
	 *    *  能把一个对象的状态转化成持久化状态
	 *    *  能把一个对象存放到一级缓存中
	 */
	@Test
	public void testUpdate(){
		/**
		 * 1、利用get方法获取
		 * 2、利用session.evict方法清空
		 * 3、再利用update方法
		 * 4、再用get方法获取
		 */
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = (Classes)session.get(Classes.class, 2L);
		session.evict(classes);
		classes.setDescription("aaa");
		session.update(classes);
		Classes classes2 = (Classes)session.get(Classes.class,2L);
		transaction.commit();
	}
	
	@Test
	public void testFlush(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		//持久化状态的数据
		Classes classes = (Classes)session.get(Classes.class, 1L);
		Set<Student> students = classes.getStudents();
		for(Student student:students){
			student.setClasses(null);
		}
		Student student = new Student();
		student.setSname("王二麻子");
		student.setDescription("爷们");
		Student student2 = new Student();
		student2.setSname("王二麻子的哥");
		student2.setDescription("爷们的哥");
		//student.setClasses(classes);
		//student2.setClasses(classes);
		students.add(student);
		students.add(student2);
		/**
		 * session.flush方法
		 *   *  hibernate内部会去检查session缓存中的所有的对象
		 *   *  如果该对象是持久化对象,并且该对象的ID在数据库中有对应的记录,并且该对象的属性
		 *      有变化,则会自动发出update语句,如果该对象的属性没有变化,则不发出update语句
		 *   *  检查持久化对象中是否有关联的对象,如果有关联的对象,并且设置了级联操作,这个时候
		 *      会检查级联对象的id在数据库中有没有对应的记录,如果有,则发出update语句,如果没有,则
		 *      发出insert语句
		 *   *  如果有维护关系的代码,则还会改变关系
		 *   *  全部检查完成以后,就发出sql语句,把一级缓存中的内容同步到数据库中
		 */
		session.flush();
		transaction.commit();
		session.close();
	}
	
	@Test
	public void testFlush2(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Student student1 = (Student)session.get(Student.class, 1L);
		Student student2 = (Student)session.get(Student.class, 2L);
		Student student3 = (Student)session.get(Student.class, 3L);
		Student student4 = (Student)session.get(Student.class, 4L);
		student1.getClasses().setCname("aaa");
		student2.getClasses().setDescription("asdf");
		session.flush();
		transaction.commit();
	}
	
	@Test
	public void testReflesh(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = (Classes)session.get(Classes.class, 1L);
		classes.setCname("bbb");
		//把一个对象对应的数据库的数据重新更新到一级缓存中
		session.refresh(classes);
		
		session.clear();//清空一级缓存中的所有的数据
		classes = (Classes)session.get(Classes.class, 1L);
		System.out.println(classes.getCname());
		transaction.commit();
	}
	/**
	 * 批量操作模拟数据池 批量操作数据库
	 */
	@Test
	public void testBatchSave(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		for(int i=0;i<100000;i++){
			if(i%50==0){
				session.flush();
				session.clear();
			}
			Classes classes = new Classes();
			classes.setCname(i+"aaa");
			session.save(classes);
		}
		transaction.commit();
	}
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值