Hibernate更新某些字段的几种update方法

Hibernate 中如果直接使用

Session.update(Object o);

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

比如:

view plaincopy to clipboardprint?
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();
}
}
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?
Hibernate:
update
Teacher
set
age=?,
birthday=?,
name=?,
title=?
where
id=?
Hibernate:
update
Teacher
set
age=?,
birthday=?,
name=?,
title=?
where
id=?

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

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

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

有三中方法:

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

view plaincopy to clipboardprint?
<property name=”age” update=”false”></property>
<property name=”age” update=”false”></property>

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

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

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

view plaincopy to clipboardprint?
Hibernate:
update
Teacher
set
birthday=?,
name=?,
title=?
where
id=?
Hibernate:
update
Teacher
set
birthday=?,
name=?,
title=?
where
id=?

缺点:不灵活····

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

view plaincopy to clipboardprint?
<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语句修改数据

view plaincopy to clipboardprint?
public void update(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery(“update Teacher t set t.name = ‘yangtianb’ where id = 3″);
query.executeUpdate();
session.getTransaction().commit();
}
public void update(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery(“update Teacher t set t.name = ‘yangtianb’ where id = 3″);
query.executeUpdate();
session.getTransaction().commit();
}

Hibernate 执行的SQL语句:

view plaincopy to clipboardprint?
Hibernate:
update
Teacher
set
name=’yangtianb’
where
id=3
Hibernate:
update
Teacher
set
name=’yangtianb’
where
id=3

时间: 2024-09-20 11:58:06

Hibernate更新某些字段的几种update方法的相关文章

TableAdapter的几种Update方法比较,哪个执行的效率高

问题描述 TableAdapter.Update(DataSet)TableAdapter.Update(DataTable)TableAdapter.Update(DataRow)TableAdapter.Update(DataRows())哪个执行的效率更高?当使用DataSet,DataTable参数时,ADO.Net是否遍历每一行.如果是这样的话,使用TableAdapter.Update(DataTable.GetChanges())是否比TableAdapter.Update(Dat

Hibernate之update(1)——更新部分字段

  Hibernate 中如果直接使用Session.update(Object o),会把这个表中的所有字段更新一遍. 如果你没有对你需要更新的字段以外的字段赋值,那么这些字段会被置空. public class TeacherTest { @Test public void update() { Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction()

sql update更新不同字段类型性能分析

.如下:  代码如下 复制代码 1,update test007 set key1 = key1 + '1' where id = 200000; 2,update test007 set key1 = key1 + '1' where id = '200000'; 注意上面查询语句区别在于参数的类型不同,前者为数字型,后者为字符型,同时id为200000这条记录是不存在的. 如果使用第二条查询,而且满足记录不存在,这条查询将出现严重的效率问题,测试情况如下: 二,测试实践 1,创建一张测试数据

通过JDBC操纵Oracle数据库LOB字段的几种情况分析

oracle|数据|数据库 通过JDBC操纵Oracle数据库LOB字段的几种情况分析纵横软件制作中心 雨亦奇2003-6-10 15:14:19在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象.档案等).而LONG.LONG RAW等类型的字段,虽然存储容量也不小(可达2GB),但由于一个表中只能有一个这样类型的字段的

【hibernate框架】核心开发接口-update方法

1.更新一个Detached(脱管状态)对象,把它重新变成Persistent(持久化状态),然后在数据库里做更新. 示例: public void testUpDate1(){ Configuration cfg=new Configuration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession(); session.beginTransaction(); Te

请问hibernate更新删除优化问题

问题描述 如果用hibernate自己的update()方法,那么更新时会先查对象,在进行更新,也就是产生两条sql语句,如果我用SQLQUERY执行(updatetablesetx=xwhereid=x)这样的话一句语句就可以搞定,性能上应该有所提高吧?请问是第一种用update()方法好还是第二种自己写sql语句好? 解决方案 解决方案二:用hibernate的吧,你的优化不是很明显,并且也没有事务处理等其他必要的要求.解决方案三:数据库就好比是个"老外";hibernate既是&

mysql批量更新多条记录的同一个字段为不同值的方法_Mysql

首先mysql更新数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 也可以这样用in指定要更新的记录: UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values'); 这里注意 'other_values' 是一个逗号(,)分隔的字符串,如:1,2,3 如果更新多条数据而且每条记录要更新

浅析Hibernate继承关系树的三种映射方式

在向大家详细介绍Hibernate继承关系树的三种映射方式之前,首先让大家了解下Employee类为抽象类,然后全面介绍. 在域模型中,类与类之间除了关联关系和聚集关系,还可以存在继承关系,Company类和Employee类之间为一对多的双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类:HourlyEmployee类和 SalariedEmployee类.由于Java只允许一个类最多有一个直接的父类,因此Employee类.H

mysql如何更新数据库字段教程

  mysql如何更新数据库字段教程 语法 UPDATE table_name SET column_name = new_value WHERE column_name = some_value 注释:SQL 对大小写不敏感.UPDATE 与 update 等效. 为了让 PHP 执行上面的语句,我们必须使用 mysql_query( 函数.该函数用于向 SQL 连接发送查询和命令. 例子 稍早时,我们在本教程中创建了一个名为 "Person" 的表.它看起来类似这样: FirstN