论坛首页 Java企业应用论坛

hibernate 中怎么执行update操作

浏览 8948 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (19) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-22  
我想了好多种办法,一开始我想在dao层直接getHibernateTemplate().find("hql")但是结果是出错了,还有一种我之前可以用的那种:就是在业务成实现类里面创建类对象保存起来在缓存里面用set.属性值 保存,但是结果是给lock了。

现在的解决办法是在dao层:

String hqlString="update TbAds set state = " + 1 + " where adsId = " +id;

Query query=getSession().createQuery(hqlString);

query.executeUpdate();
   发表时间:2011-05-22  
将update好的对象HibernateTemplate.merge("TableName",entity);就行了,更新操作怎么能用find()方法呢?
0 请登录后投票
   发表时间:2011-05-22  
... 基础很重要啊!
0 请登录后投票
   发表时间:2011-05-23  
jk19910410 写道
将update好的对象HibernateTemplate.merge("TableName",entity);就行了,更新操作怎么能用find()方法呢?

对。我实现的功能是对每条信息的状态设置。 如果用的是merge,  它可以对单独的一条信息进行设置(如:运行、暂停 操作) 没问题,再进行另外一条信息操作时候就会 被锁住而报错.. 我也不知道是为什么..
我就在业务层这么写的:
 TbAds tbAds=tbAdsDAO.findById(id);
		 if (sta==1) {
			tbAds.setState(0);
			
			tbAdsDAO.merge(tbAds);
		}
		 else {
			tbAds.setState(1);
			tbAdsDAO.merge(tbAds);
		}
 


之后我就把业务层调用该dao层方法 改在dao层写:
if (sta==1) {
			String hqlString=" update TbAds set state = " + 0 + " where adsId = " + id;
			
			Query query=getSession().createQuery(hqlString);
		
			query.executeUpdate();
		}
		else {
			String hqlString="update TbAds set state = " + 1 + " where adsId = " +id;
	
			Query query=getSession().createQuery(hqlString);
			
			query.executeUpdate();
		}

结果可以对任意一条信息进行状态的设置了。。
(--
为什么会被锁住 ?可能会是缓存的设置问题..?









0 请登录后投票
   发表时间:2011-05-23  
aflyer 写道
... 基础很重要啊!

确实.
0 请登录后投票
   发表时间:2011-05-23  
楼主不会想表达的是批量修改操作吧?

原来有5条记录,现在修改成3条记录?

给你个笨方法,在一个事务里面,先删除,在插入,呵呵
0 请登录后投票
   发表时间:2011-05-23   最后修改:2011-05-23
 TbAds tbAds=tbAdsDAO.findById(id);
		 if (sta==1) {
			tbAds.setState(0);
			
			tbAdsDAO.merge(tbAds);
		}
		 else {
			tbAds.setState(1);
			tbAdsDAO.merge(tbAds);
		}
 

if (sta==1) {
			String hqlString=" update TbAds set state = " + 0 + " where adsId = " + id;
			
			Query query=getSession().createQuery(hqlString);
		
			query.executeUpdate();
		}
		else {
			String hqlString="update TbAds set state = " + 1 + " where adsId = " +id;
	
			Query query=getSession().createQuery(hqlString);
			
			query.executeUpdate();
		}


你们是按代码行数算绩效的吗?
0 请登录后投票
   发表时间:2011-05-23  
Hibernate对象的三种状态

瞬时的(Transient)
由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时的(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时对象在程序中没有被引用,它会被Java垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态(Hibernate会自动执行必要的SQL语句)。

持久的(Persistent)
一个持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session的作用范围内。Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象的状态同步到数据库,开发者不需要手动执行UPDATE语句。同样的,将一个对象变为瞬时(Transient)状态,也不需要手动执行DELETE语句。

分离的(Detached)
与持久对象关联的Session被关闭后,对象就变为分离的(Detached)的。 对分离对象的引用仍然是有效的,对象可以继续被修改。分离对象如果重新关联到某个新的Session上, 会再次转变为持久的(在Detached其间的改动将被持久化到数据库中)。
0 请登录后投票
   发表时间:2011-05-23  
wenlongzh 写道
 TbAds tbAds=tbAdsDAO.findById(id);
		 if (sta==1) {
			tbAds.setState(0);
			
			tbAdsDAO.merge(tbAds);
		}
		 else {
			tbAds.setState(1);
			tbAdsDAO.merge(tbAds);
		}
 

if (sta==1) {
			String hqlString=" update TbAds set state = " + 0 + " where adsId = " + id;
			
			Query query=getSession().createQuery(hqlString);
		
			query.executeUpdate();
		}
		else {
			String hqlString="update TbAds set state = " + 1 + " where adsId = " +id;
	
			Query query=getSession().createQuery(hqlString);
			
			query.executeUpdate();
		}


你们是按代码行数算绩效的吗?

++1
0 请登录后投票
   发表时间:2011-05-23  
bulkupdate(hsql)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics