在hibernate中, Session.update()方法的修改会把所有的字段更新一遍,但是我们在开发中会常用到只修改部分数据。
public void add(){
Session session=HibernateuUtils.getSessionFactory.getCurrentSession();
session.beginTransaction();
User user=(User)session.get(User.class,1);
user.setName("张三");
session.update();
session.beginTransaction().commit();
}
现这种会所有的数据全部更新一遍;
在控制台打印出的sql语句如下:
Hibernate:
update
User
set
age=?,
birthday=?,
name=?,
title=?
where
id=?
在上面的例子中可以看出,我们只需要修改name属性,但是从打印的sql语句得出,update()方法是把所有的属性够修改了一遍。这样如果我们的数据中有文本类型的大量数据,它的执行效率就会很低。
改善它有三种方法:
1、XML中设置property 标签 update = "false" ,如下:我们设置 age 这个属性在更改中不做更改。
<property name="age" update="false"></property>
在Annotation中 在属性GET方法上加上@Column(updatable=false)
@Column(updatable=false)
public int getName() {
return name;
}
但是这种方式不灵活
2、第2种方法··使用XML中的 dynamic-update="true"
<class name="com.sccin.entity.Student" table="student" dynamic-update="true">
<class name="com.sccin.entity.Student" table="student" dynamic-update="true">
<class name="com.hibernnate.User" table="sys_User" dynamic-update="true">
3、使用HQL语句
public void update(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("update User t set t.name = 'yangtianb' where id = 1");
query.executeUpdate();
session.getTransaction().commit();
}
打印的sql语句是:
Hibernate:
update
User
set
name='yangtianb'
where
id=1