hibernate 中如果直接使用session.update(object o),會把這個表中的所有字段更新一遍。
如果你沒有對你需要更新的字段以外的字段指派,那麼這些字段會被置空。
public class teachertest
{
@test
public void update()
session session = hibernateuitl.getsessionfactory().getcurrentsession();
session.begintransaction();
teacher t = (teacher) session.get(teacher.class, 3);
t.setname("yangtb2");
session.update(t);
session.gettransaction().commit();
}
hibernate 執行的sql語句:
hibernate:
update
teacher
set
age=?,
birthday=?,
name=?,
title=?
where
id=?
我們隻更改了name屬性,而hibernate 的sql語句 把所有字段都更改了一次。
這樣要是我們有字段是文本類型,這個類型存儲的内容是幾千,幾萬字,這樣效率會很低。
那麼怎麼隻更改我們更新的字段呢?有三中方法:
1.xml中設定property 标簽 update = "false" ,如下:我們設定 age 這個屬性在更改中不做更改
<property name="age" update="false"></property>
在annotation中 在屬性get方法上加上@column(updatable=false)
@column(updatable=false)
public int getage() {
return age;
我們在執行 update方法會發現,age 屬性 不會被更改
缺點:不靈活
2.使用xml中的 dynamic-update="true"
<class name="com.sccin.entity.student" table="student" dynamic-update="true">
ok,這樣就不需要在字段上設定了。
但這樣的方法在annotation中沒有
3.第三種方式:使用hql語句(靈活,友善)
使用hql語句修改資料
{
session session = hibernateuitl.getsessionfactory().getcurrentsession();
session.begintransaction();
query query = session.createquery("update teacher t set t.name = 'yangtianb',t.age = '20' where id = 3");
query.executeupdate();
session.gettransaction().commit();
注意:更新每個字段之間的逗号不可少,否則報錯。
name='yangtianb', age='20'
id=3
這樣就隻更新了我們更新的字段
自己整理的一些方法:
1、使用hidden标簽,把不需要的字段也查出來,然後在傳回去。
2、再查一邊資料庫,聲明一個新的對象,再把頁面傳過來的資料set進去,儲存這個新聲明的對象
原帖位址:http://www.cnblogs.com/hyteddy/archive/2011/07/21/2113175.html