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

Hibernate 中如果直接使用

Session.update(Object o);

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

比如:

[java] view plaincopy

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

Hibernate 执行的SQL语句:Hibernate 执行的SQL语句:

[java] view plaincopy

  1. Hibernate:
  2. update
  3. Teacher
  4. set
  5. age=?,
  6. birthday=?,
  7. name=?,
  8. title=?
  9. where
  10. id=?

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

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

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

有三中方法:

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

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

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

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

有三中方法:

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

[java] view plaincopy

  1. <property name="age" update="false"></property>

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

[java] view plaincopy

  1. @Column(updatable=false)
  2. public int getAge() {
  3. return age;
  4. }

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

[java] view plaincopy

  1. Hibernate:
  2. update
  3. Teacher
  4. set
  5. birthday=?,
  6. name=?,
  7. title=?
  8. where
  9. id=?

缺点:不灵活····

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

[java] view plaincopy

  1. <class name="com.sccin.entity.Student"  table="student" dynamic-update="true">

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

但这样的方法在Annotation中没有

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

使用HQL语句修改数据

[java] view plaincopy

  1. public void update(){
  2. Session session =  HibernateUitl.getSessionFactory().getCurrentSession();
  3. session.beginTransaction();
  4. Query query = session.createQuery("update Teacher t set t.name = ‘yangtianb‘ where id = 3");
  5. query.executeUpdate();
  6. session.getTransaction().commit();
  7. }

Hibernate 执行的SQL语句:

[java] view plaincopy

    1. Hibernate:
    2. update
    3. Teacher
    4. set
    5. name=‘yangtianb‘
    6. where
    7. id=3
时间: 2024-11-05 19:00:38

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

hibernate update 只更新部分字段的3种方法(其实我只想说第二种)

hibernate 中如果直接使用Session.update(Object o);会把这个表中的所有字段更新一遍. 比如: public class Teacher Test { @Test public void update(){ Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher) session.

Hibernate 更新部分字段的实现

在Hibernate 中,有时我们只需要更新部分字段,此时如果使用update()方法,会将所有字段都更新,对于没有set的字段,就会设置成NULL,如果这些字段里面有非空的字段就会报错. 解决的方法可以直接写HQL语句,但是如果字段较多,并且更新的字段是不确定的时候,直接写HQL语句就显得比较麻烦. 另一种方法是在XML文件中设置dynamic-update="true",这样设置以后,只对set了的字段更新,没有set的字段就不会更新. <class name="c

Hibernate更新部分字段浅谈

update语句是在Hibernate的Configuration的时候生成的,不能动态改变.为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题. 如果想要做到只更新改变了的字段,必须做到两点:1.对PO的每个属性设置version进行状态跟踪2.update语句是动态生成的,在实际向数据库更新的时候,依次检查每个属性的version,决定哪些属性需要更新,动态构造update语句. 单单要做到上述第一点,就势必要给PO的操作带来沉重的负担

mssql sqlserver 表增加列后,视图不会自动更新相关列的两种解决方法分享

摘要: 今天对物理数据表,进行增加列操作后,程序一直显示无法找到相应列,通过仔细比对发现,视图中无相应列更新,下文将具体的解决方法分享如下: 例: create view vw_test as select * from tableName go ---当我们在表tableName中新增列之,再次查询vw_test ---依然未发现相应列的存在. ----解决方法1:删除原视图,重新创建视图 drop view vw_test go create view vw_test as select *

EntityFramework 更新数据库字段的三种方法

例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public TestDbContext() : base() { } } public class Test { public long ID { get; set; } public string Name { get; set; } public string Email { get; set; } public

Python 字典(Dictionary) update()方法

Python 字典(Dictionary) update()方法 描述: Python 字典(Dictionary) update() 函数把字典dict2的键/值对更新到dict里. 语法: update()方法语法: dict.update(dict2) 参数: dict2 -- 添加到指定字典dict里的字典. 返回值: 该方法没有任何返回值. 实例: 以下实例展示了 update()函数的使用方法: #!/usr/bin/python dict = {'Name': 'Zara', 'A

[原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

mysql的时间字段 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT &#39;更新时间&#39;

在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候,该字段默认值为当前时间 ON UPDATE CURRENT_TIMESTAMP表示每次更新这条数据的时候,该字段都会更新成当前时间 这两个操作是mysql数据库本身在维护,所以可以根据这个特性来生成[创建时间]和[更新时间]两个字段,且不需要代码来维护 如下: CREATE TABLE `mytest` ( `text` varchar(255) DEFAULT '' COMMENT '内容', `cr

ElasticSearh更新nested字段(Array数组)。怎么根据查询条件(query)复制一个(index)到新的Index how to update by query a nested fields data for elasticsearch

GET usernested/_search { "query": { "nested": { "path": "tags", "query": { "bool": { "must": [ { "term": { "tags.brandid": "93a8296c-5b64-49ea-bd92-b19192def2e9