先看写代码的方法:

@Test
    public void testUpdate3() {
       
       
        Teacher t = new Teacher();
        t.setId(1);//指定了主键也可以直接更新
        t.setName("zhanglaoshi");
       
        Session session2 = sessionFactory.getCurrentSession();
        session2.beginTransaction();
        session2.update(t);
       
        session2.getTransaction().commit();
    }
   
    @Test
    public void testUpdate4() {
       
       
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        Teacher t = (Teacher)session.get(Teacher.class, 1);
        t.setName("zhangsan2");
        session.getTransaction().commit();//提交的时候会自动检查和数据库中的数据一样不一样,如果有就会自动进行更新。
    }

只写代码并不好使,因为他们更新的时候不会只更新name,会把所有字段都更新一遍,就算和原来数据一致也会更新。这导致效率降低很多。为了解决这一情况,我们可以做一些修改。有以下几种方式:

方式1(不推荐)

修改注解,将不打算参与更新的字段的get方法上加上这么一段:@Column(updatable=false)。

关于持久化相关注解的更多内容可以参看jee api的javax.persistence相关内容。

方式2(不推荐)

修改映射关系xml,<property name="age" update="false" />

关于持久化映射关系xml配置的更多内容可以参看hibernate的doc文档(关于本例,参考目录hibernate-release-4.2.8.Final\documentation\manual\en-US\html_single中的5. Basic O/R Mapping---5.1. Mapping declaration---5.1.4. Property---5.1.4.2 )

方式3

在hbm配置文件上加上下面的黑体行

<hibernate-mapping>
    <class name="com.test.hibernate.Student" dynamic-update="true">

如此,在同一个session中更新数据就可以只更新变更了的数据。

如果想跨session只更新修改了的字段,可以手动让hibernate去比较,session.merge(要比较的从别的session里取出来后修改过的对象)。但是为了作比较hibernate会自动先查询一遍数据库。

但是用注解怎么实现呢?????用注解能实现吗????难道为了只更新修改的字段我们就要把映射关系都在xml文件里实现而放弃注解?这个我暂时也不知道,如果你看到了就自己查去吧。。

方式4(推荐)

使用HQL(EJBQL)自己写一条类似sql而非sql的语句

@Test
public void testUpdate7() {
   
   
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query q = session.createQuery("update Student s set s.name='z5' where s.id = 1");//这个org.hibernate.Query对象类似于jdbc的statement,这里update的不是表而是对象s,所以指明Student类用了大写的S
    q.executeUpdate();
    session.getTransaction().commit();
   
}

hibernate 关于session的update方法的更多相关文章

  1. Hibernate中的session对象update方法的使用

    使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...

  2. Hibernate的merge与update方法的区别

    今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样.实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容: 1. 数 ...

  3. Hibernate&nbsp;Session的delete()方法

    本文介绍Hibernate Session的delete()方法.delete()方法用于从数据库中删除与Java对象对应的记录.对应游离对象和持久化对象,delete语句会做出不同的反应. AD:  ...

  4. hibernate的session对象核心方法注意的问题

    1.session.save()方法 1).session.save()方法会使一个对象从临时状态转变为持久化状态. 2).session.save()方法会赋予持久化对象的OID属性一个ID值,以对 ...

  5. Hibernate中session的save方法问题

    今天在使用session.save(),进行插入数据操作时,一直没有成功,也没有报错.后来发现是因为没有创建事务,提交事务的原因 你对flush和commit的意思没有理解到:1,flush代表刷新, ...

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

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

  7. Hibernate Session对象核心方法

    1. 持久化对象的状态: 站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态 Session 的特定方法能使对象从一个状态转到另一个状态 临时对象: 在 ...

  8. Hibernate(5)session的方法

    1. Session缓存 Session缓存(Hibernate一级缓存),在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存.只要 Se ...

  9. Hibernate 通过 Session 操纵对象

    Session 概述 •Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. •Session 具有 ...

随机推荐

  1. luogu P1979 华容道

    solution 被假hash可了半天....sadQAQ code // luogu-judger-enable-o2 #include<queue> #include<cstdi ...

  2. 【后缀自动机】hihocoder1449 后缀自动机三·重复旋律6

    解题方法提示 小Hi:上次我们已经学习了后缀自动机了,今天我们再来解决一个用到后缀自动机的问题. 小Ho:好!那我们开始吧! 小Hi:现在我们要对K=1..length(S)求出所有长度为K的子串中出 ...

  3. 【KMP】BZOJ3942-[Usaco2015 Feb] Censoring

    [题目大意] 有一个S串和一个T串,长度均小于1,000,000,设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加,若U串后缀为T,则去掉这个后缀继续流程.输出最后的S串. [思路]三 ...

  4. [NOIp2016提高组]换教室

    题目大意: 有n节课,第i节课在c[i]上课,同时d[i]也有一节课d[i]. 你有权利向教务处发出m次申请把自己的教室改到d[i],相应的批准概率是k[i]. 教室是图上的一些点,其中每条边都有边权 ...

  5. HDU 5636 Shortest Path 暴力

    Shortest Path 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 Description There is a path graph ...

  6. CentOS 6.9下双网卡绑定单个IP地址及装网卡绑定到一个网桥(转)

    说明:经过查阅,原来双网卡绑定一个IP的专业名词叫做bond,可以实现负载均衡:如果想要实现两张网卡绑定到一个网桥,基本思路是两张网卡设置同一个网桥是行不通的,但如果先实现bond,然后将bond绑定 ...

  7. 通过修改VHD文件的位置来提升性能

    昨天用VHD装了一个Win 10的预览版体验了一下,感觉磁盘操作非常慢,便用HD Tune测试了一下,发现速度只有物理硬盘的一半都不到.          这个倒大出我意料之外,由于VHD的便利性,我 ...

  8. opencv Mat 像素操作

    1 cv::Mat cv::Mat是一个n维矩阵类,声明在<opencv2/core/core.hpp>中.   class CV_EXPORTS Mat { public: //a lo ...

  9. bottle+cherrypy快速开发web服务

    我目前用得最顺手的python web框架是bottle,简单方便. bottle有一个开发用的http服务器,效率不高,单线程,阻塞. 所以,得找个别的服务器来部署. 根据bottle官方的文档,发 ...

  10. (转)PV、UV、IP之间的区别与联系

    PV是网站分析的一个术语,用以衡量网站用户访问的网页的数量.对于广告主,PV值可预期它可以带来多少广告收入.一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者 ...