Hibernate_主键生成策略

/**
	 * 测试uuid主键生成策略
	 */
	public static void testSave01() {
		Session session = null;
		try {
			//
			session = HibernateSessionFactory.getSession();
			session.beginTransaction();
			Users user = new Users();
			//
			user.setUserName("龙哥");
			user.setUserPassowrd("123123");
			// 由于user的主键生成侧路采用的是uuid,所以调用完save后,只是将user纳入到了session
			// 的管理中不会发生insert语句,但是id已经生成。
			session.save(user);
			// 调用flush,hibernate会清理缓存,执行sql.
			session.flush();
			// 默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush
			session.getTransaction().commit();

		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	/**
	 * 测试native主键生成策略
	 */
	public static void testSave02() {
		Session session = null;
		try {
			//
			session = HibernateSessionFactory.getSession();
			session.beginTransaction();
			Users user = new Users();
			// 因为user的主键生成策略为native,所以调用session.save后,
			// 将执行insert语句,返回数据库生成的Id
			user.setUserName("龙哥");
			user.setUserPassowrd("123123");
			session.save(user);
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	/**
	 * 测试uuid主键生成策略
	 */
	public static void testSave03() {
		Session session = null;
		try {
			//
			session = HibernateSessionFactory.getSession();
			session.beginTransaction();
			Users user = new Users();
			//
			user.setUserName("龙哥");
			user.setUserPassowrd("123123");
			// 由于user的主键生成侧路采用的是uuid,所以调用完save后,只是将user纳入到了session
			// 的管理中不会发生insert语句,但是id已经生成。
			session.save(user);
			// 将user对象从session中逐出,即session中existsInDatebase状态为false.
			session.evict(user);
			// 无法成功提交因为hibernate在清理缓存时在session的insertions集合中取出user对象进行insert操作后
			// 需要更新entityEntries属性中的existsInDatabase为true而我们采用evict
			// 已经将user从session的entityEntries
			// 中逐出了所以找不到相关数据无法更新抛出异
			session.getTransaction().commit();

		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	/**
	 * 测试uuid主键生成策略
	 */
	public static void testSave04() {
		Session session = null;
		try {
			//
			session = HibernateSessionFactory.getSession();
			session.beginTransaction();
			Users user = new Users();
			// 因为user的主键生成侧路采用的是uuid所以调用完成save后只是将user纳入到了session的管理
			// 不会发出insert语句但是id已经生成session中existsInDatebase状态为false
			session.save(user);
			// flush后hibernate会清理缓存会将user对象保存到数据库中将session中的insertions中的user对象
			// 清除并且设置session中existsInDatebase的状态为true
			session.flush();
			// 将user对象从session中逐出即session的EntityEntries属性中逐出
			session.evict(user);
			// 可以成功提交因为hibernate在清理缓存时在session的insertions集合中无法找到user对象
			// 所以就不会发出insert语句也不会更新session中的existsInDatabase的状
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	/**
	 * 测试native主键生成策略
	 */
	public static void testSave05() {
		Session session = null;
		try {
			//
			session = HibernateSessionFactory.getSession();
			session.beginTransaction();
			Users user = new Users();
			// 因为user的主键生成策略为native,所以调用session.save后,
			// 将执行insert语句,返回数据库生成的Id
			user.setUserName("龙哥");
			user.setUserPassowrd("123123");

			/**
			 * 因为user的主键生成策略为native,所以调用session.save后,将执行sql
			 * 返回数据生成Id,纳入了session管理 修改了session中existsIndatebase状态为true
			 * 
			 */
			session.save(user);
			/**
			 * 将user对象从session中逐出,即session的EntityEntire属性中逐出
			 */
			session.evict(user);
			/**
			 * 可以成功提交因为在hibernate在清理缓存时,在session的insertions集合中无法找到user对象。
			 */
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}
 转载:http://www.open-open.com/doc/view/3acb087888bc417795a35db99b2a5b2c
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值