hibernate的Session中的flush方法

hibernate的Session中的flush方法:

flush方法的作用:执行sql,清理缓存。

 

1:使用uuid主键生成策略来测试flush:

 
@Test
	public void test1() {
		Session session = HibernateUtils.getSession();
	    Transaction t = session.beginTransaction();
	    try {
			User user = new User();
			user.setUsername("KD");
			user.setGender(1);
			user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1984-10-10"));
			/*
			 * 现在我的主键生成策略是uuid,这个主键是由Session生成,执行完save就会生成主键。
                         * user对象会存储在Session的临时存储区以及持久区。
                         * 这里是不会发送ql语句的,sql语句是在执行flush();方法的时候被执行。
			 */
			session.save(user);
			/*
			 * 发出sql语句,清理临时存储区,将dirty由true变为false,表示此时的数据不是脏数据,没有flush之前是脏数据。
			 */ 
			session.flush();
			t.commit();
		} catch (ParseException e) {
			e.printStackTrace();
			t.rollback();
		}finally{
			HibernateUtils.closeResource(session);
		}
	} 
uuid,这个主键是由Session生成,执行完save就会生成主键。
                         * user对象会存储在Session的临时存储区以及持久区。
                         * 这里是不会发送ql语句的,sql语句是在执行flush();方法的时候被执行。
			 */
			session.save(user);
			/*
			 * 发出sql语句,清理临时存储区,将dirty由true变为false,表示此时的数据不是脏数据,没有flush之前是脏数据。
			 */ 
			session.flush();
			t.commit();
		} catch (ParseException e) {
			e.printStackTrace();
			t.rollback();
		}finally{
			HibernateUtils.closeResource(session);
		}
	} 

主键的生成策略是uuid的时候,当我执行save();方法的时候,就会来为我生成主键。而且此时不仅数据临时存储区中有了数据,而且在持久化上下文中也有了对象数据。

hibernate的Session中的flush方法_第1张图片

 

hibernate的Session中的flush方法_第2张图片

 

hibernate的Session中的flush方法_第3张图片

hibernate的Session中的flush方法_第4张图片

 

当我执行flush()方法的时候,就会向数据库中发送sql语句,临时数据区中不在有对象数据了,但是持久化数据区中会有数据,Session会将对象管理起来。

hibernate的Session中的flush方法_第5张图片

hibernate的Session中的flush方法_第6张图片

hibernate的Session中的flush方法_第7张图片

 

综上所述:flush();方法为我们发出sql语句,让sql语句去执行,数据库中就会有相应的数据。Hibernate认为,只要发送sql语句了,这条数据就不是脏数据了。我在数据库中,可不可以看到数据,是由我数据库的隔离级别决定的。

hibernate的Session中的flush方法_第8张图片

 

hibernate的Session中的flush方法_第9张图片

 

 

现在我在flush方法的前面使用逐出方法evict();示例代码:


	@Test
	public void test1() {
		Session session = HibernateUtils.getSession();
	    Transaction t = session.beginTransaction();
	    try {
			User user = new User();
			user.setUsername("命里有时终须有");
			user.setGender(1);
			user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1984-10-10"));
			/*
			 * 现在我的主键生成策略是uuid,这个主键由Session生成,执行完save就会生成主键。
			 * user对象会存储在Session的临时存储区。
			 */
			session.save(user);
			/*
			 * 使用Session中的evict();方法,将User对象从Session中逐出,此时User就会变为脱管对象。我们可以在Session的持久区中看到User对象的数据已经被清理了
			 */
			session.evict(user);
			/*
			 * 由于上面的操作,我的User对象变为了脱管对象,此时我使用flush();方法,就不会发出sql语句了。dirty依旧是true,数据依旧是脏数据。
			 */
			session.flush();
			t.commit();
		} catch (ParseException e) {
			e.printStackTrace();
			t.rollback();
		}finally{
			HibernateUtils.closeResource(session);
		}
	}

 

 

你可能感兴趣的:(hibernate的Session中的flush方法)