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

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()的胃口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值