Hibernate 更新部分更改的字段 hibernate update

Hibernate 中如果直接使用

Session.update(Object o);

会把这个表中的所有字段更新一遍。

比如:

view plaincopy to clipboardprint?
01.public class TeacherTest {  
02.    @Test 
03.    public void update(){  
04.        Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
05.        session.beginTransaction();  
06.        Teacher t = (Teacher) session.get(Teacher.class, 3);  
07.        t.setName("yangtb2");  
08.        session.update(t);  
09.          
10.        session.getTransaction().commit();  
11.    }  
12.} 
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语句:

view plaincopy to clipboardprint?
01.Hibernate:   
02.    update  
03.        Teacher   
04.    set  
05.        age=?,  
06.        birthday=?,  
07.        name=?,  
08.        title=?   
09.    where  
10.        id=? 
Hibernate:
    update
        Teacher
    set
        age=?,
        birthday=?,
        name=?,
        title=?
    where
        id=?

我们只更改了Name属性,而Hibernate 的sql语句 把所有字段都更改了一次。

这样要是我们有字段是文本类型,这个类型存储的内容是几千,几万字,这样效率会很低。

那么怎么只更改我们更新的字段呢?

有三中方法:

 1.XML中设置property 标签 update = "false" ,如下:我们设置 age 这个属性在更改中不做更改

view plaincopy to clipboardprint?
01.<property name="age" update="false"></property> 
 <property name="age" update="false"></property> 

  在Annotation中 在属性GET方法上加上@Column(updatable=false)

view plaincopy to clipboardprint?
01.@Column(updatable=false)  
02.    public int getAge() {  
03.        return age;  
04.    } 
@Column(updatable=false)
 public int getAge() {
  return age;
 }

我们在执行 Update方法会发现,age 属性 不会被更改

view plaincopy to clipboardprint?
01.Hibernate:   
02.    update  
03.        Teacher   
04.    set  
05.        birthday=?,  
06.        name=?,  
07.        title=?   
08.    where  
09.        id=? 
Hibernate:
    update
        Teacher
    set
        birthday=?,
        name=?,
        title=?
    where
        id=?

缺点:不灵活····

2.第2种方法··使用XML中的 dynamic-update="true"

view plaincopy to clipboardprint?
01.<class name="com.sccin.entity.Student"  table="student" dynamic-update="true"> 
<class name="com.sccin.entity.Student"  table="student" dynamic-update="true">

OK,这样就不需要在字段上设置了。

但这样的方法在Annotation中没有

3.第三种方式:使用HQL语句(灵活,方便)

使用HQL语句修改数据


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Baykermr/archive/2010/03/09/5359913.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值