在Hibernate2中對(duì)某個(gè)表進(jìn)行更新和刪除,必須先把它Load出來(lái),在后更改,然后再保存。
這個(gè)過(guò)程對(duì)于批量操作或者對(duì)于表關(guān)系比較復(fù)雜的情況,是很復(fù)雜的。
在Hibernate3中HQL語(yǔ)句中已經(jīng)支持update 和delete 了
但是要注意的是update和delete的HQL不是面向?qū)ο蟮牧恕D阌脤?duì)象方式的語(yǔ)句返回會(huì)出錯(cuò)。
下面是一個(gè)簡(jiǎn)單的例子。
用對(duì)象的方式,不用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:
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寫(xiě)成這個(gè)樣子:
update Contact as c set c.relationShip.relationId =1 ......
反而會(huì)出錯(cuò),也就是說(shuō),你就按照native SQL去寫(xiě)就行了。
還有,如果能使用這樣的功能
hibernate.query.factory_class = org.hibernate.hql.classic.ClassicQueryTranslatorFactory這個(gè)Hibernate配置屬性要不去掉,要不換成
org.hibernate.hql.ast.ASTQueryTranslatorFactory上面那個(gè)是支持Hibernate2的。
但是有一點(diǎn)要注意,如果你用update語(yǔ)句來(lái)做的話,可能產(chǎn)生緩存同步問(wèn)題,而且兩種方法最后Hibernate執(zhí)行的語(yǔ)句差不多,對(duì)于第一種方法Hibernate也是就生成一條update語(yǔ)句,當(dāng)然因?yàn)槲沂歉鶕?jù)主鍵來(lái)update的,如果批量處理的話還是用Update HQL快。