hibernate 关于session的update方法
先看写代码的方法:
@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方法的更多相关文章
- Hibernate中的session对象update方法的使用
使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...
- Hibernate的merge与update方法的区别
今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样.实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容: 1. 数 ...
- Hibernate Session的delete()方法
本文介绍Hibernate Session的delete()方法.delete()方法用于从数据库中删除与Java对象对应的记录.对应游离对象和持久化对象,delete语句会做出不同的反应. AD: ...
- hibernate的session对象核心方法注意的问题
1.session.save()方法 1).session.save()方法会使一个对象从临时状态转变为持久化状态. 2).session.save()方法会赋予持久化对象的OID属性一个ID值,以对 ...
- Hibernate中session的save方法问题
今天在使用session.save(),进行插入数据操作时,一直没有成功,也没有报错.后来发现是因为没有创建事务,提交事务的原因 你对flush和commit的意思没有理解到:1,flush代表刷新, ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate Session对象核心方法
1. 持久化对象的状态: 站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态 Session 的特定方法能使对象从一个状态转到另一个状态 临时对象: 在 ...
- Hibernate(5)session的方法
1. Session缓存 Session缓存(Hibernate一级缓存),在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存.只要 Se ...
- Hibernate 通过 Session 操纵对象
Session 概述 •Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. •Session 具有 ...
随机推荐
- EXISTS运算符
和IN.ANY.ALL等运算符不同,EXISTS运算符是单目运算符,它不与列匹配,因此它也不要求待匹配的集合是单列的.EXISTS运算符用来检查每一行是否匹配子查询,可以认为EXISTS就是用来测试子 ...
- 【DFS】算24点
[tyvj2802/RQNOJ74]算24点 描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”.您作为游戏者将得到4个1~9之间的自然数作为操作数,而您 ...
- 【后缀自动机】CDOJ1551 Hesty Str1ng
可以发现,对于原串的每个长度>1的子串而言,将其除了最后一个字符之外反向接在其结尾,都是一个合法解.该解的长度一定是奇数. 对于原串的每个长度>2,且结尾两个字符相同的子串而言,将其除了最 ...
- Django contenttypes 框架详解
一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...
- JDK源码学习笔记——HashSet LinkedHashSet TreeSet
你一定听说过HashSet就是通过HashMap实现的 相信我,翻一翻HashSet的源码,秒懂!! 其实很多东西,只是没有静下心来看,只要去看,说不定一下子就明白了…… HashSet 两个属性: ...
- Mobiscroll手机触屏日期选择器
最近在制作jquery mobile因要用到日历控件,突然发现Mobiscroll非常不错.于是摘下来记录. A Mobiscroll是一个用于触摸设备(Android phones.iPhon ...
- 陈立伟 - MultiCharts快易通(2013年8月2日)
<MultiCharts快易通> 作 者:陈立伟 译 者: 系 列:寰宇程式交易312--挑战程式交易系列1 出 版:寰宇出版股份有限公司 字 数:千字 阅读完成:2013年8月2日
- Learning Note: SQL Server VS Oracle–Database architecture
http://www.sqlpanda.com/2013/07/learning-note-sql-server-vs.html This is my learning note base on t ...
- 转载:做ArcEngine的二次开发出现“没有注册类别 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)”
转自:http://blog.sina.com.cn/s/blog_638e61a40100ynnc.html 出现这个问题主要是因为32位操作系统和64位操作系统存在兼容性问题. 解决方案: 1.鼠 ...
- HTTPS 信任证书
使用HttpsURLConnection访问HTTPS链接时一般需要引入证书,否则会产生异常. 但是也可以使用信任所有证书的方式来达到访问的目的. 经上网查询资料发现一个很好用的类来实现信任所有证书的 ...