1. 程式人生 > >Hibernate update 只更新被修改欄位

Hibernate update 只更新被修改欄位

2012-11-21 11:16:48|  分類: 預設分類 |  標籤: |字號訂閱

Hibernate 中如果直接使用 Session.update(Object o); 會把這個表中的所有欄位更新一遍。 如果我們只更改了state屬性,而Hibernate 的sql語句 把所有欄位都更改了一次。 這樣要是我們有欄位是文字型別,這個型別儲存的內容是幾千,幾萬字,這樣效率會很低。 那麼怎麼只更改我們更新的欄位呢? 有三種方法: 1、XML中設定property 標籤 update = “false” ,如下:我們設定 state 這個屬性在更改中不做更改 <property name=”state” update=”false”></property> 如有幾個欄位不做更改,需在相應property,增加
update=”false” 在Annotation中 在屬性GET方法上加上@Column(updatable=false) @Column(updatable=false) public int getState() { return state; } @Column(updatable=false) public int getState() { return state; } 我們在執行 update方法會發現,state 屬性 不會被更改。 缺點:不靈活。如需要有多個欄位指定不同的組合修改時不適用。 Hibernate生成的SQL語句,是指定修改欄位的: Hibernate:      update         tdb.checkin      set         state=?     where         id=? 2、第2種方法··使用XML中的 dynamic-update=”true”
v<class name="org.itair.bean.CheckIn" table="checkin"  dynamic-update="true"> OK,這樣就不需要在欄位上設定了。 可以看出,hibernate生成的SQL語句: Hibernate:      update         tdb.checkin      set         maddr=?,         mtime=?,         state=?,         ctime=?,         rec=?,         sid=?      where         id=? 雖然set了多個欄位,但資料庫更改的只是修改的欄位。 但這樣的方法在Annotation中沒有。 3、第三種方式:使用HQL語句(靈活,方便)
使用HQL語句修改資料: @Override public void updateState(CheckIn ch) { Session session = this.getHibernateTemplate().getSessionFactory() .openSession(); Transaction tx = session.beginTransaction(); String hql = "update CheckIn ch set ch.state = :state where ch.id= :id"; Query query = session.createQuery(hql); query.setInteger("state", ch.getState()); query.setInteger("id", ch.getId()); query.executeUpdate(); tx.commit(); session.close(); } Hibernate 執行的SQL語句: Hibernate:      update         tdb.checkin      set         state=?     where         id=? 這樣就只更新了我們所需要更新的欄位!