您的位置:首页 > 其它

hibernate常用的接口和类的方法以及持久化对象的状态变化

2011-02-17 17:04 316 查看
一、hibernate常用的接口和类的方法

A、Configuration 此类是创建配置文件(hibernate.cfg.xml)的对象的类,当它创建好时调用的是configure()方法即可加载配置文件
eg: Configuration cfg=new Configuration().configure();
如果项目中涉及到多个数据源,那么必须针对每个数据源创建一个配置文件

B、SessionFactory是Session的工厂对象,一个数据源有且只能创建一个此对象,此类的作用是对数据库的链接,根据所配置的信息来产生session对象

C、Session接口,是一个提供数据的CRUD操作以及持久化对象的持久操作
常见的主要方法:save(),update(),delete(),clear(),close(),flush(),get(),load(),beginTransaction()。
1.save():将持久化对象保持到session缓存中,切忌并不是数据库中,它主要做的事情是:a.根据持久化对象标识生成策略去标识,如:native,会在oracle数据库中产生序列 的nextval即:hibernate_sequence.nextval。assigned,要手动的输入主键。b.将获取到的标识数据通过持久化对象的setter方法放入对象中,所以对象在sava方法里才能够获得标识 的值。c.将持久化对象放入session缓存,在commit()的时候会生成insert语句

2.update(): 将保存在session缓存中的持久化对象的数据进行更新,但不能跟新持久化标识,在commit()的时候会生成update语句

3.delete():此方法用于从数据库中删除与Java对象对应的记录。如果传入的参数是持久化对象,Session就计划执行一个delete语句。如果传入的参数是游离对象,先使游离对象被 Session关联,使它变为持久化对象,然后计划执行一个delete语句。值得注意的是,Session只有在提交事务的时候的才执行delete语句。此外,只有当调用Session的close()方法时 ,才会从Session的缓存中删除该对象。

例如以下代码先加载一个持久化对象,然后通过delete()方法将它删除:

Session session1 = sessionFactory.openSession();

Transaction tx1 = session1.beginTransaction();

// 先加载一个持久化对象

Customer customer = (Customer)session.get(Customer.class, new Long(1));

session.delete(customer); // 计划执行一个delete语句

txt1.commit(); // 清理缓存,执行delete语句

session.close();子// 从缓存中删除Customer对象

以下代码直接通过delete()方法删除一个游离对象:

Session session2 = sessionFactory.openSession();

Transaction tx2 = session1.beginTransaction();

// 假定customer是一个游离对象,先使它被Session关联,使它变为持久化对象,

// 然后计划执行一个delete语句

session2.delete(customer);

tx2.commit(); // 清理缓存,执行delete语句

session2.close(); // 从缓存中删除customer对象

如果希望删除多个对象,可以使用另一种重载形式的delete()方法:

session.delete("from Customer as c where c.id>8");

以上delete()方法的参数为HQL查询语句,delete()方法将从数据库中删除所有满足查询条件的记录。

4.clear(),clear(),close(),flush():都是清空session中的对象

5.get(),load():如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。get方法如果在session缓存中找到了该id对应的对象 ,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体 数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。load()是延迟加载,当使用加载的对象的时候,hibernate才会发出sql语句。

6.beginTransaction():它是对事务的开启

D. Transaction,是一个接口,提供了事务的控制操作。
常见的方法主要有:
begin():开始事务
commit(): 清空session中的对象,并且更新到数据库中
rollback():回滚事务

二、hibernate的持久化对象的状态变化

A. 瞬态:对象不存在于session中,也不存在于数据库中
B. 持久态:对象存在于session中,数据库中存不存在没关系
C. 游离态:对象不存在于session中,存在于数据库中

session的save()、update()、get()、load()会将对象变成持久态
session的clear()、close()、flush()会将对象变成托管态或者瞬态(没有进行事物提交)
session的delete()会将对象变成瞬态

经过研究,瞬态在经过session.sava(obj)后,在commit()时就会将瞬态转化为持久态,游离态在session.update(obj)后,在commit()时就会将游离态转化为持久态,最终是将瞬态,游离态转化为持久态与数据库打交道
尽管以上的内容很繁琐,但是只需要记住一点:session中可以保存对象,并且session中不同对象,标识不能相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐