12.Hibernate的持久化操作对象状态和一级缓存

	@Test
	public void testInsert() {
		Configuration config=new  Configuration().configure();
		SessionFactory sessionFactory=config.buildSessionFactory();
		Session session=sessionFactory.openSession();//得到Session对象
		Transaction transaction=session.beginTransaction();//开启事务
		
		UserTest1 user =new UserTest1();  //瞬时态
		user.setName("黎明");       
		user.setAge(20);
		user.setGender("女");
		session.save(user);               //持久态
		transaction.commit();             //提交事务
		session.close();                    //关闭资源
		sessionFactory.close();        
		System.out.println(user);           //托管态
		
		
	}

在上面的代码中,使用new关键字创建对象时,该对象是没有标识的,也没有与进行关联,它处于瞬时状态。执行save方法后,对象以经处于session管理的范畴了,并且有了自己的OID,此时对象处于持久态。当执行commit对象时,对象就不在Session的管理范畴了,从持久态变成托管态。

持久态与托管态的区别是有没有与Session关联。

二:hibernate的一级缓存

一级缓存就是session缓存。Session缓存是一块内存空间,用于存储和管理Java对象。

在使用Hibernate查询对象时,首先会使用对象的OID值在Hibernate的一级缓存中取出使用:如果没有找到匹配的对象,则会去数据库中查询对应的数据。当从数据库中查出数据时,该数据信息会存到以及缓存中。由此可见。Hibernate的一级缓存是为了减少对数据库的访问次数。

1.当调用Session接口的save(),update(),savaOrUpdate(),如果Session缓存中没有相应的对象,则Hibernate就会自动把数据库中查询到的相应对象信息存到一级缓存里。

2.当调用Session接口的load(),get()方法,以及Queryj接口的list(),iterator()方法时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果没有查询的对象。则会去数据库查询对象,并添加到一级缓存中。

3.当调用Session的close()方法时,Session缓存会被清空。

4.Session能够在某些情况下,按照缓存中的对象的变化,执行相对应SQL语句同步更新数据库,这一过程称为刷存。

以下几种情况会刷存

1.调用commit()

2.当应用程序执行查询操作时,如果缓存中持久化对象的属性已经发生变化,先刷出缓存,以报查询结果能反映持久化对象的最

新的状态

3.调用flush()方法

@Test
	public void findByIdTest() {
		
	Configuration config=new  Configuration().configure();
	SessionFactory sessionFactory=config.buildSessionFactory();
	Session session=sessionFactory.openSession();
	Transaction transaction=session.beginTransaction();
        //获取对象时,由于一级缓存里没有数据,所以会发送SQL语句,查询数据中的数据
	UserTest1 user5 =session.get(UserTest1.class,3 );
        //获取对象时,不会发送SQL语句,会从Session缓存中获取数据
        UserTest1 user5 =session.get(UserTest1.class,3 );
        System.out.println(user5.getId()+user5.getName()+user5.getAge()+user5.getGender());
        session.save(user5);
	transaction.commit();
	session.close();
	sessionFactory.close();
	
	
}

Hibernate的快照技术

Hibernate在向一级缓冲中存入输入数据的同时,还会复制一份数据存入Hibernate的快照中。当调用commit()方法时,会清理一级缓存中的数据,同时检测一级缓存中的数据和快照区的数据是否相同。如果不同则执行update()语句,将一级缓存中的数据同步到数据库中,并更新快照;反之,则不会执行update()方法。

public void testInsert() {
		Configuration config=new  Configuration().configure();
		SessionFactory sessionFactory=config.buildSessionFactory();
		Session session=sessionFactory.openSession();//得到Session对象
		Transaction transaction=session.beginTransaction();//开启事务
		UserTest1 user =new UserTest1();  	
                user.setName("赵灵");       
		user.setAge(10);
		user.setGender("女");
		session.save(user);     //向一级缓存中存入对象
		user.setAge(23);         //修改年龄
		transaction.commit();     //提交事务         		
                session.close();            
                sessionFactory.close();        
		System.out.println(user);           		
	
	}

猜你喜欢

转载自blog.csdn.net/cainame/article/details/81277796