@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);
}