在Hibernate2中對某個表進行更新和刪除,必須先把它Load出來,在后更改,然后再保存。
這個過程對于批量操作或者對于表關系比較復雜的情況,是很復雜的。
在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.class2);
        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寫成這個樣子:
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快。