Hibernate有一个机制,对于get出来的实体,一旦用setxxx方法改变过属性值,在事务完结前它会很聪明地将其持久化(亦就是保存至数据库),不知道为什么它这样做,毕竟我还没有使用saveorupdate呢,就给我更新了。
比如如下代码:
List<TdMenuCategory> lvTmp=mTdDao.find(TdMenuCategory.class,"select * from td_menu_category where fd_pr_cat =? "+(pvShowEnabledOnly?" and fd_enabled ":"")+" order by fd_order_flag "
,new Object[]{pvParent},new Type[]{new StringType()});
for (TdMenuCategory item:lvTmp/*mTdDao.findBy("fdPrCat", pvParent, "fdOrderFlag", true)*/){
item.setFdDesc(mvMsg.getMessage(item.getFdDesc(), pvLocale));
...
}
这个方法完毕后,查看日志,果然有一条update语句,有种日了狗的感觉没有。。。
...
Hibernate:
update
td_menu_category
set
fd_cl_icon=?,
fd_desc=?,
fd_enabled=?,
fd_order_flag=?,
fd_pr_cat=?
where
fd_category=?
19:30:15,152 TRACE BasicBinder:81 - binding parameter [1] as [VARCHAR] - [icon-cogs]
19:30:15,152 TRACE BasicBinder:81 - binding parameter [2] as [VARCHAR] - [单据管理]
19:30:15,152 TRACE BasicBinder:81 - binding parameter [3] as [BOOLEAN] - [true]
19:30:15,152 TRACE BasicBinder:81 - binding parameter [4] as [VARCHAR] - [05]
19:30:15,152 TRACE BasicBinder:81 - binding parameter [5] as [VARCHAR] - []
19:30:15,152 TRACE BasicBinder:81 - binding parameter [6] as [VARCHAR] - [TRANS]
...
前者用sessionFactory.getCurrentSession(),clear();后者用sessionFactory.getCurrentSession(),evict(entity); 假如在缓冲中将这个属性改变过的entity清除掉,事务结束时就不会被持久化了。