1. 程式人生 > >hibernate中的update方法只更新部分欄位的方法

hibernate中的update方法只更新部分欄位的方法

Hibernate 中如果直接使用
Session.update(Object o);
會把這個表中的所有欄位更新一遍。

比如:

?
1 2 3 4 5 6 7 8 9 10 11 12 public class TeacherTest {<br> @Test<br> public void update(){<br> Session session = HibernateUitl.getSessionFactory().getCurrentSession();<br> session.beginTransaction();<br>
Teacher t = (Teacher) session.get(Teacher.class, 3);<br> t.setName("yangtb2");<br> session.update(t);<br> <br> session.getTransaction().commit();<br> }<br> }<br>

Hibernate 執行的SQL語句:

?
1 2 3 4 5 6 7 8 9 10 Hibernate: <br>
UPDATE<br> Teacher <br> SET<br> age=?,<br> birthday=?,<br> name=?,<br> title=? <br> WHERE<br> id=?<br>
我們只更改了Name屬性,而Hibernate 的sql語句 把所有欄位都更改了一次。
這樣要是我們有欄位是文字型別,這個型別儲存的內容是幾千,幾萬字,這樣效率會很低。
那麼怎麼只更改我們更新的欄位呢?
有三中方法:
1.XML中設定property 標籤 update = “false” ,如下:我們設定 age 這個屬性在更改中不做更改
?
1 <property name=”age” update=”false”></property><br>
在Annotation中 在屬性GET方法上加上@Column(updatable=false)

@Column(updatable=false)
    public int getAge() {
        return age;
    }

我們在執行 Update方法會發現,age 屬性 不會被更改

Hibernate: 
    UPDATE
        Teacher 
    SET
        birthday=?,
        name=?,
        title=? 
    WHERE
        id=?

缺點:不靈活····
2.第2種方法··使用XML中的 dynamic-update="true"

?
1 <class name="com.sccin.entity.Student" table="student" dynamic-update="true"/><br>
OK,這樣就不需要在欄位上設定了。
但這樣的方法在Annotation中沒有
3.第三種方式:使用HQL語句(靈活,方便)
使用HQL語句修改資料 ?
1 2 3 4 5 6 7 public void update(){<br> Session session = HibernateUitl.getSessionFactory().getCurrentSession();<br> session.beginTransaction();<br> Query query = session.createQuery("update Teacher t set t.name = 'yangtianb' where id = 3");<br> query.executeUpdate();<br> session.getTransaction().commit();<br> }<br>

Hibernate 執行的SQL語句:
Hibernate:
    update
        Teacher
    set
        name='yangtianb'
    where
        id=3

這樣就只更新了我們更新的欄位······