Hibernate的本质是对纯java JDBC的封装,Spring-orm是对Hibernate的封装。
Hibernate是面向对象OO和关系型数据库RMDB的中介,通过Hibernate,java程序员看到的都是面向对象的,java的对象,而不是数据表和字段。
Hibernate基本接口:

Configuration接口 -- 配置hibernate
SessionFactory接口 -- 初始化hibernate,创建Session
Session接口 -- 保存、更新、删除、加载和查询
Transaction接口 -- 事务管理
Query接口 -- 查询

Hibernate对象的四个状态:

临时对象 transient java对象还没有持久化、也不处于Session中;
持久化对象 persistent java对象已经持久化、也处于Session中;
被删除对象 removed java对象不再处于Session中,数据库中对应的数据也将被删掉;
游离对象 detached java对象已经持久化,但是不再处于Session中;

基本方法:
flush() 将缓存session中对象的数据,同步至数据库;立刻,马上;
clear() 清空缓存session中的对象,但是缓存本身还保留;
close() 关闭缓存session,不再保留缓存及内部对象;
commit() 提交事务;
rollback() 事务回滚;
refresh() 从数据库select数据同步给内存中的session中的对象;
update() 将游离对象转化为持久化对象,更新数据库中的数据;

在此解释一下flush()和update()的关系:
对数据库进行更新的时候(增删改查中的改)
flush()只能将session中已经有的数据同步给数据库;也就是将持久化对象更新到数据库;其他状态java对象的数据的更新工作,flush()是无能为力的;
update()可以将游离对象的数据,更新到数据库;也可以将持久化对象的数据,更新到数据库;但是对于临时对象的更新,无能为力;
下面的代码都是节选,因此可能会造成误解,最后会补上完整的代码。
测试flush():

    private MyHiberDao mhd;@Autowiredpublic void setMhd(MyHiberDao mhd) {this.mhd = mhd;}UserDep ud4 = mhd.findById(UserDep.class, "2200");ud4.setEname("尼克");mhd.flush();

上述代码可以顺利修改数据库中对应的数据。
原因是findById()方法(核心是session.get())得到的ud4这个java对象,是持久化对象;你后面修改了持久化对象的一个属性,然后flush(),可以很正常的修改数据库,没有任何问题。

测试update():

    private MyHiberDao mhd;@Autowiredpublic void setMhd(MyHiberDao mhd) {this.mhd = mhd;}UserDep ud4 = mhd.findById(UserDep.class, "2200");ud4.setEname("尼克");mhd.update(ud4);

上述代码也可以顺利修改数据库中对应的数据。
原因基本一样,因为java对象本身是持久化对象。

下面测试flush()方法操作一个临时对象:

      //测试flush()方法,对临时对象直接flush();UserDep ud2 = new UserDep();ud2.setKostl("2204");ud2.setEname("测试系");ud2.setLevel("1");mhd.flush();//结果就是不成功;

新建的对象属于临时对象,临时对象压根就不在session中,所以flush()不起作用。如果想保存数据,这个时候必须用save()方法。

      //测试MyHiberDao封装的save()方法;不测试事务,仅测试save();UserDep ud2 = new UserDep();ud2.setKostl("1501");ud2.setEname("信息课");ud2.setLevel("1");mhd.save(ud2);

结果当然是成功的。

下面我们来验证一下,刚刚的假设:
游离对象的flush()

      UserDep ud4 = mhd.findById(UserDep.class, "2200");mhd.evict(ud4);ud4.setEname("总决赛");mhd.flush();System.out.println(ud4.getEname());

结果就是,数据库无法更新。evict()方法让原本属于持久化对象的ud4变成了游离对象,这个时候flush()没有任何价值,因为ud4已经从session中移除了。

游离对象的update()

      UserDep ud4 = mhd.findById(UserDep.class, "2200");mhd.evict(ud4);ud4.setEname("总决赛");mhd.update(ud4);System.out.println(ud4.getEname());

结果是,数据库正常更新。游离对象,正对update()的胃口。

Hibernate+Spring-orm的基本方法总结相关推荐

  1. Spring ORM示例 - JPA,Hibernate,Transaction

    Spring ORM示例 - JPA,Hibernate,Transaction 欢迎来到Spring ORM示例教程.今天我们将使用Hibernate JPA事务管理来研究Spring ORM示例. ...

  2. Struts2+Hibernate+Spring 整合示例

    转自:https://blog.csdn.net/tkd03072010/article/details/7468769 Struts2+Hibernate+Spring 整合示例 Spring整合S ...

  3. Spring ORM示例 - 带有AOP事务管理

    Spring ORM示例 - 带有AOP事务管理 这是一个非常简单的Spring ORM示例,向您展示如何使用Spring配置应用程序 依赖注入(@Autowired annotation), JPA ...

  4. Struts hibernate Spring 框架原理

    转自:http://www.cnblogs.com/javaNewegg/archive/2011/08/28/2156521.html 原理: 1.通过Configuration().configu ...

  5. Hibernate框架ORM的实现原理-不是技术的技术

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!  Hib ...

  6. spring aop示例_具有AOP事务管理的Spring ORM示例

    spring aop示例 This is a very simple Spring ORM example that shows you how to configure an application ...

  7. Hibernate+Spring+Struts2+ExtJS开发CRUD功能

    http://blog.csdn.net/myloon/archive/2007/11/08/1873652.aspx-----多谢这么好的文章 Hibernate+Spring+Struts2+Ex ...

  8. 【struts2+hibernate+spring项目实战】实现用户登录功能(ssh)

    一.概述 从今天才开始有时间来总结总结以前自己练习的一些东西,希望总结出来对以后可以更加便捷的来学习,也希望可以帮助到正需要这些东西的同行人,一起学习,共同进步. 二. 登录功能总结 2.1.登录功能 ...

  9. Spring AOP根据JdbcTemplate方法名动态设置数据源

    2019独角兽企业重金招聘Python工程师标准>>> 说明:现在的场景是,采用数据库(Mysql)复制(binlog)的方式在两台不同服务器部署并配置主从(Master-Slave ...

  10. SSH整合(Struts2+hibernate+spring)

    1.创建表 create table t_user(id int primary key auto_increment,username varchar(50),password varchar(32 ...

最新文章

  1. 空调能窃听插座能放火?物联网成了“危”联网
  2. hdu 4012(bfs+位压缩)
  3. php制图汉字,PHP用imageTtfText函数在图片上写入汉字
  4. Android之数据库操作
  5. 在CentOS7上安装和使用ZooKeeper最新版本(V3.4.12)
  6. 杭州趣链张帅:区块链应用落地,融合产业高速发展
  7. vue 使用this.reload方法刷新页面配置
  8. adnroid中LayoutParams的简单总结
  9. c++函数如何返回一个vector_如何将Python的一个函数进行超时限制
  10. 计算机二级试题java_计算机二级java精选试题及答案
  11. Winclone快速安装苹果电脑双系统教程
  12. 图书自助借阅功能分析
  13. Windows Server 2012 R2 服务器密码忘记问题
  14. 四分位数和百分位数_20种四分位数
  15. 用Multisim仿真对调幅波进行解调
  16. HTMLCSS基础篇之十一:字体与颜色样式
  17. 【JAVA Core】精品面试题100道
  18. 重磅,2020广播电视科技创新奖揭晓
  19. 线上流量对比应用实践
  20. 文末送书 | 全面梳理总结!交通时空大数据分析、挖掘与可视化

热门文章

  1. 炫酷大屏demo_可视化大屏动态效果
  2. android矢量动画 充电,android矢量动画
  3. oracle 数据精度转换,oracle数据值型数据改精度测试
  4. 64位系统识别内存 服务器,服务器内存和电脑内存的区别
  5. flask 检测post是否为空_用Flask和Vue制作一个单页应用(五)
  6. 旋转的Apriltag码
  7. 2021年春季学期-信号与系统-第八次作业参考答案-第十一小题
  8. 条形压电陶瓷执行器件和高压驱动器
  9. abb焊接机器人编程全解_焊接机器人的焊枪编程也是很重要的
  10. armv8 汇编 绝对地址赋值_ARMv8带来的变化