您的位置:首页 > 其它

Hibernate学习--- Session.evict()方法

2013-11-04 09:53 465 查看
但是与commit同时使用,会抛出异常
session = HibernateUtils.getSession();
tx = session.beginTransaction();

User1 user = new User1();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);

session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
//无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。

tx.commit();

解决在逐出session缓存中的对象不抛出异常的方法:
在session.evict()之前进行显示的调用session.flush()方法就可以了。
//利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);

//flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false
session.flush();

session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象

//可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。
tx.commit();


但是与commit同时使用,会抛出异常
session = HibernateUtils.getSession();
tx = session.beginTransaction();

User1 user = new User1();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);

session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象
//无法成功提交,因为hibernate在清理缓存时,在session的临时集合(insertions)中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session中逐出了,所以找不到相关数据,无法更新,抛出异常。

tx.commit();

解决在逐出session缓存中的对象不抛出异常的方法:
在session.evict()之前进行显示的调用session.flush()方法就可以了。
//利用Hibernate将实体类对象保存到数据库中
//因为user主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入session的管理
//不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
session.save(user);

//flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且会设置session中的existsInDatabase状态为false
session.flush();

session.evict(user);//从session缓存(EntityEntries属性)中逐出该对象

//可以成功提交,因为hibernate在清理缓存时,在Session的insertions中集合中无法找到user对象所以不会发出insert语句,也不会更新session中existsInDatabase的状态。
tx.commit();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐