Hibernate+Spring-orm的基本方法总结

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

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;
    @Autowired
    public 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;
    @Autowired
    public 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()的胃口。

目录
相关文章
|
10天前
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
|
2月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
36 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
2月前
|
Java Spring
|
2月前
|
存储 SQL Java
|
2月前
|
Java 数据库连接 数据库
|
2月前
|
缓存 Java 数据库连接
|
2月前
|
Java 数据库连接 API
|
2月前
|
Java 数据库连接 应用服务中间件
|
3月前
|
安全 Java Spring
Spring问题之如何配置Bean的初始化方法和销毁方法
Spring问题之如何配置Bean的初始化方法和销毁方法
下一篇
无影云桌面