Session session = sessionFactory.openSession(); User user1 = (User) session.load(User.class, new Integer(1)); User user2 = (User) session.load(User.class, new Integer(1)); System.out.println(user1 == user2); session.close();第二次查询数据时,由于在快取中找到数据对象,于是直接返回,这与第一次查询到的数据对象是同一个实例,所以会显示true的结果。
Session session = sessionFactory.openSession(); User user1 = (User) session.load(User.class, new Integer(1)); session.evict(user1); User user2 = (User) session.load(User.class, new Integer(1)); System.out.println(user1 == user2); session.close();由于user1所参考的对象被从快取中移去了,在下一次查询时,Session在Map容器中找不到对应的数据,于是重新查询数据库并再封装一个对象,所以user1与user2参考的是不同的对象,结果会显示false。
Session session = sessionFactory.openSession(); User user1 = (User) session.load(User.class, new Integer(1)); session.clear(); User user2 = (User) session.load(User.class, new Integer(1)); System.out.println(user1 == user2); session.close();同样的道理,这次也会显示false。
Session session1 = sessionFactory.openSession(); User user1 = (User) session1.load(User.class, new new Integer(1)); session1.close(); Session session2 =sessionFactory.openSession(); User user2 = (User)session2.load(User.class, new Integer(1)); session2.close(); System.out.println(user1 == user2);第一个Session在关闭后,快取也关闭了,在第二个Session的查询中并无法用到第一个Session的快取,两个Session阶段所查询到的并不是同一个对象,结果会显示false。
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); while(....) { // 大量加载对象时的循环示意 .... session.save(someObject); if(count % 100 == 0) { // 每100笔资料 session.flush(); // 送入数据库 session.clear(); // 清除快取 } } tx.commit(); session.close();在SQL Server、Oracle等数据库中,可以在Hibernate设定文件中设定属性hibernate.jdbc.batch_size来控制每多少笔数据就送至数据库,例如:
.... <hibernate-configuration> <session-factory> .... <property name="hibernate.jdbc.batch_size">100</property> .... </session-factory> <hibernate-configuration>在MySQL中则不支持这个功能。