Hibernate之深入理解持久化对象

持久化是将程序数据在持久化状态和瞬时状态间转换的机制,持久化类可以被hibernate保存到数据库并且从数据库中读取的类。简而言之,一个对象一旦被持久化了,那么这个对象的某个属性一旦改变了,数据库中的属性也会随之改变,所以这样就可以让程序员做到采用完全面向对象的方式来操作数据库了,而无需管理数据库的一些操作。

不过一个类要持久化,也是要有一些要求的:

(1)提供一个无参数的构造函数:Hibernate可以使用Constructor.newInstance()方法来创建实例,所以这里最好创建一个无参数的构造函数

(2)提供一个标识属性:也就是数据库表中的主键,这两者性质是一样的

另外,还需为该类提供setter和getter方法,并且该类为非final类,在需要将持久化类的实例放入Set中时,得重写equals()和hashCode()方法(这个后面介绍)。

一般的持久化类有三个状态:瞬态、持久化和脱管三个状态。

瞬态:就是使用new创建的对象但是并没有与Session对象关联的对象,这种状态不会持久化到数据库中,即这时对象的属性发生改变时并不会影响数据库中的信息。如果程序中失去了瞬态对象的引用,瞬态对象将被会回收到垃圾回收机制销毁。使用Hibernate的Session可以使其变成持久化状态。

持久化状态:这个状态就是实体类与数据库中的表进行了关联,实体类进行了改动数据库中的表也会进行改动。

脱管:某个实例之前属于持久化,但是关联Session关闭后,变成了脱管状态,这就变成了普通对象了。当然托管状态也是可以再次持久化,与Session关联后可以再次写进数据库。

下面将逐个讲解持久化的一些操作:

(1)持久化实体

为了将一个瞬态的实体变成持久化状态,Hibernate  Session提供了两个方法:Serializable save(Object  obj)和void  persist(Object obj),这两个方法都是将对象转化为持久化状态,该对象的属性将被保存到数据库里。当然save方法在之前的例子里已经用到过,这里的persist方法用法是一样的。注意:save方法和persist方法还是有一定的区别的:save方法会立即将持久化对象对应的数据插入数据库,而persist方法则保证当它在一个事物外部被调用时,并不立即转换成insert语句,这个功能在需要封装一个长会话时比较有用(后面会涉及到)。因此一般再使用持久化实体的时候就是用save就行。

(2)根据主键加载持久化实体

程序可以通过load()方法来加载一个持久化实例,这其实就相当于数据库操作的查找一样,不过这里的查找元素只能是标识属性,也就是数据库对应的主键。

使用方法:

User user2=session.get(User.class, 1);

这样可以做到查找的功能,另外也有一个方法:使用session的get()方法。两者的区别:load方法如果没有匹配到数据库记录,可能会报HibernateException异常,如果持久化注解中指定了延迟加载,则该方法会返回一个未初始化的代理对象;而get方法会立刻访问数据库,如果没有对应的记录,则返回null。

(3)更新持久化实体

实体的状态为持久化状态时,更改实体类时,数据库中就会做出相应的改变。

更新持久化实体的方法为:

User user2=session.load(User.class, 1);
user2.setName("李四");
session.flush();

注意:这里调用session对象的flush方法是将持久化实体所做的修改在flush方法之前自动保存在数据库,因此修改数据库最简单的方法就是在Session处于打开状态时load或load它,然后直接修改即可。

(4)删除持久化实体

删除持久化实例最简答的方法就是调用Session的delete方法:

	User user2=session.get(User.class, 1);
		session.delete(user2);

这样通过上面的四种方法以及之前介绍的例子就可以实现面向对象的数据库的增删查改的功能了。

另外,如果一个持久化对象处于脱管实体,即曾经是一个持久化对象,但是Session关闭了,也是可以将持久化,方法为:首先建立一个新的Session实例,然后调用Session的update()、merge()和updateorSave()方法。update方法会保存程序对持久化对象所做的修改;如果不清楚该对象曾经时候持久化过,则可以调用updateOrSave()方法,如果曾经持久化化过,就执行update操作,否则执行save操作。merge方法可将程序对脱管对象所做的修改保存到数据库,但不会持久化给定的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值