在Hibernate2中对某个表进行更新和删除,必须先把它Load出来,在后更改,然后再保存。
这个过程对于批量操作或者对于表关系比较复杂的情况,是很复杂的。
在Hibernate3中HQL语句中已经支持update 和delete 了
但是要注意的是update和delete的HQL不是面向对象的了。你用对象方式的语句返回会出错。
下面是一个简单的例子。
用对象的方式,不用HQL:
update Contact as c set c.relationShip.relationId =1 ......
反而会出错,也就是说,你就按照native SQL去写就行了。
还有,如果能使用这样的功能
hibernate.query.factory_class = org.hibernate.hql.classic.ClassicQueryTranslatorFactory
这个Hibernate配置属性要不去掉,要不换成org.hibernate.hql.ast.ASTQueryTranslatorFactory
上面那个是支持Hibernate2的。
但是有一点要注意,如果你用update语句来做的话,可能产生缓存同步问题,而且两种方法最后Hibernate执行的语句差不多,对于第一种方法Hibernate也是就生成一条update语句,当然因为我是根据主键来update的,如果批量处理的话还是用Update HQL快。
这个过程对于批量操作或者对于表关系比较复杂的情况,是很复杂的。
在Hibernate3中HQL语句中已经支持update 和delete 了
但是要注意的是update和delete的HQL不是面向对象的了。你用对象方式的语句返回会出错。
下面是一个简单的例子。
用对象的方式,不用HQL:
Session session = getSession();
Customer host = (Customer) session.load(Customer.class,hostEmail);
Customer guest = (Customer)session.load(Customer.class,guestEmail);
ContactId id= new ContactId(host,guest);
Contact contact = (Contact)session.load(Contact.class,id);
RelationShip relation = (RelationShip)session.load(RelationShip.class, 2);
contact.setRelationShip(relation);
contact.setUpdateTime(Calendar.getInstance().getTime());
session.flush();
session.close();
用HQL:Customer host = (Customer) session.load(Customer.class,hostEmail);
Customer guest = (Customer)session.load(Customer.class,guestEmail);
ContactId id= new ContactId(host,guest);
Contact contact = (Contact)session.load(Contact.class,id);
RelationShip relation = (RelationShip)session.load(RelationShip.class, 2);
contact.setRelationShip(relation);
contact.setUpdateTime(Calendar.getInstance().getTime());
session.flush();
session.close();
private static final String HQL_BADGUY_TO_FRIEND = "update Contact set relation_id = 1, updateTime = :updateTime where host = :hostEmail and guest = :guestEmail";
Session session = getSession();
Query query = session.createQuery(HQL_BADGUY_TO_FRIEND);
query.setString("hostEmail",hostEmail);
query.setString("guestEmail",guestEmail);
query.setDate("updateTime",Calendar.getInstance().getTime());
query.executeUpdate();
session.close();
如果你把HQL写成这个样子:Session session = getSession();
Query query = session.createQuery(HQL_BADGUY_TO_FRIEND);
query.setString("hostEmail",hostEmail);
query.setString("guestEmail",guestEmail);
query.setDate("updateTime",Calendar.getInstance().getTime());
query.executeUpdate();
session.close();
update Contact as c set c.relationShip.relationId =1 ......
反而会出错,也就是说,你就按照native SQL去写就行了。
还有,如果能使用这样的功能
hibernate.query.factory_class = org.hibernate.hql.classic.ClassicQueryTranslatorFactory
这个Hibernate配置属性要不去掉,要不换成org.hibernate.hql.ast.ASTQueryTranslatorFactory
上面那个是支持Hibernate2的。
但是有一点要注意,如果你用update语句来做的话,可能产生缓存同步问题,而且两种方法最后Hibernate执行的语句差不多,对于第一种方法Hibernate也是就生成一条update语句,当然因为我是根据主键来update的,如果批量处理的话还是用Update HQL快。
博客介绍了Hibernate2和Hibernate3中对表进行更新和删除操作的差异。Hibernate2需先Load再更改保存,批量或复杂情况较复杂;Hibernate3的HQL支持update和delete,但非面向对象。还给出两种方式的示例,提醒配置属性及缓存同步问题,指出批量处理用Update HQL更快。
3126

被折叠的 条评论
为什么被折叠?



