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 


原创粉丝点击