struts2+hibernate3+spring2读书笔记12(操纵实体对象)
来源:互联网 发布:机器人编程语言 编辑:程序博客网 时间:2024/06/05 17:38
第13章 Hibernate操纵实体对象
本章导读语
在对数据库进行操作时,常见的操作除了查询外,还有添加、修改和删除记录。本章首先是进了hibernate对象的3种状态,即瞬时态(Transient)、持久态(persistent)、脱管态(Detached)。接关将讲述如何利用Hibernate提供的API来保存、更新和删除对象。另外还讲述了如何绕过Hibernate的API来进行操作。
一.解说Hibernate对象的三种状态
1.持久态
处于持久态的对象在数据库中具有对应的记录,并拥有一个持久化标识。若这两个条件都不满足,该对象将变成瞬时态的对象。当只满足第一个对件时,该对象将变成脱管态对象,持久态对象有两个特点:(1)是和session实例关联。(2)在数据库中有与之关联的记录。
2.瞬时态
由new开辟内存空间的java对象,如User user=new User (“hhr”,”男”,”26”),如果没有变量对该对象进行引用,它将被JVM(java虚拟机)回收。处于瞬间态的对象在内存中孤立存在,它是携带信息的载体,但是不和数据库的数据存在任何关联关系。
3.脱管态
当与某持久对象关联的session被关闭后,该持久对象转变成为脱管对象,脱管对象有如下特点:
(1)本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它收。
(2)比瞬时对象多了一个数据库记录标识值。
4.各种状态对象在Hibernate中的转换
(1)瞬时态—持久态的转换
瞬时态的对象可转为持久态的对象,具体方法是通过session的save()或saveOrUpdate()方法将瞬时对象与数据库关联,并将数据对应地插入数据库中,此时瞬时态变成持久态。
(2)持久态—瞬时态的转换
当对一个持久态的对象使用Hibernate的delete()访法时,将使得处于持久态的对象变成瞬时态。
(3)持久态—脱管态的转换
当一个处于持久态的对象执行session的close()或clear()、evict()之后,该对象将变成脱管态对象,此时该对象虽然具有数据识别值,但它已不在Hibernate持久层的管理之下。
(4)脱管态—持久态的转换
当脱管态的对象被重新关联上session时,将使得该对象转变成持久态的对象。脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法转变成持久对象
(5)脱管态—瞬时态的转换
处于脱管对象执行session的delete()方法,可变成瞬时态的对象。
二.保存实体对象
在进行关系数据库的操作中,查询、保存、更新和删除记录者是很常用的操作,在Hibernate中,在Hibernate中提供这几个方法都是Session接口.
1.创建hibernate.cfg.xml文件
在src目录中建立Hibernate的配置文件hibernate.cfg.xml,该文件配置连接本地的MySQL,并加上映射文件User.hbm.xml该文件的内容如下:
2.编写Session工厂类:HibernateSessionFactory.java(该类提供了获取当前session的关闭session的方法),具体代码如下:
3.编写数据库脚本user.sql
4.编写User.java
5.配置User.hbm.xml
6.编写保存实体对象测试类:SaveTest.java
备注:保存对象除了可调用Session接口的save()外,还可以调用该接口的saveOrUpdate()方法,该方法首先使用select语句查询是否有loginName与之相同的记录存在,若存在,则执行update语句对该记录进行更新操作,若不存在,则执行insert语句进行记录的插入。
三.更新实体对象
Sessin接口提供了update()和saveOrUpdate()方法来更新单个实体对象。在更新对象实体前,一般是通过load()或get()方法获得对象后再执行更新。
1.编写更新单个实体对象测试类:UpdateTest.java
在执行更新前,可通过load()或get()方法获得对象,而后更新属性后,通过Session接口的update()方法进行更新。
备注:Session接口的load()和get()方法都可以根据给定的OID从数据库中加载对象,两者的不同是当对象不存在时,get()方法返回null,而load()方法将抛出org.hibernate.ObjectNotFoundException异常。另外,还可以使用saveOrUpdate()方法执行更新有一个问题,就是需要将所有的必填性都填上,否则会抛出异常。
2.编写批量更新的测试类:BatchUpdateTest.java
实现批量更新共有4种方法,分别是:
(1)使用存储过程进行批量更新。
(2)绕过Hibernate API,直接通过JDBC API进行数据的批量更新。
(3)查询出需要更新的对象后,遍历这些对象,循环使用update()方法进行更新。
(4)使用createQuery(String hql)方法获得Query对象后,设置参数后,执行executeUpdate()方法更新记录。
备注:在使用第3种方式更新一个User对象的name属性后,就立即调用Session的flush()方法和evict()方法。Flush()方法使Hibernate立刻根据这个User对象的状态变化同步更新数据库,从而立即执行相关折update语 句evict()方法用于把这个Customer对象从缓存中清除出去,从而及时释放它占用的内存。
四.删除实体对象
五.绕过Hibernate API对数据进行操作
编写使用JDBC APIFJP 进行数据操作的类:jdbcTest.java
- struts2+hibernate3+spring2读书笔记12(操纵实体对象)
- struts2+hibernate3+spring2读书笔记7(Struts 2 标签库)
- Struts2+Spring2+Hibernate3起步
- Struts2+Spring2+Hibernate3整合
- struts2.1+spring2.5+hibernate3.3整合之第一步(spring2.5+hibernate3.3)
- Struts2+Hibernate3+Spring2中文问题
- 关于整合Struts2+Spring2+ Hibernate3
- Struts2+Spring2+Hibernate3 整合开发
- Spring2.5+Hibernate3.3+Struts2
- struts2 +hibernate3.2+spring2.0
- struts2+spring2+hibernate3整合SiteMesh
- 整合struts2+spring2+hibernate3.1
- Struts2+spring2+hibernate3整合方案
- Struts2+spring2+hibernate3整合方案
- 整合struts2+hibernate3+spring2.5
- Hibernate3 struts2 spring2 clob操作
- HIbernate 操纵实体对象
- struts2.1.2+spring2+hibernate3 web实例(第一章)
- [ZZ][扫盲贴]基于X的GNOME、GTK、GDK、XLib、GLib等之间的关系
- HDU 2005 第几天
- 安装Twisted
- 消除mstsc的登录记录
- android与j2me移植之clipRect
- struts2+hibernate3+spring2读书笔记12(操纵实体对象)
- J2ME游戏移植到Android平台的方法
- Groovy语言的介绍
- Google学术查到文献直接导入endnote的方法
- J2me游戏如何快速移植到Android (2)
- 多线程的同步和异步讲解案例
- 短路运算符和非短路运算符
- 身份证验证函数,可查看身份证地区信息
- 散伙饭