您的位置:首页 > 产品设计 > UI/UE

hibernate常用的接口和持久化对象的状态变化

2012-01-04 00:38 344 查看
Hibernate接口

Criteria、 Query、 Transaction  查询依赖

Session

SessionFactory

Configuration

hibernate.cfg.xml    hibernate数据库配置       *.hbm.xml  持久化映射

 

Configuration类

Configuration类负责管理Hibernate的配置信息

Hibernate运行的底层信息:数据库的Url,用户名,密码,jdbc驱动类,数据库Dialect,数据库连接池等

Hibernate配置文件默认为Hibernate.cfg.xml

Hibernate映射文(*.hbm.xml)

 

Configuration config =new Configuration();                                生成对象

config.configure();                                                                       加载Hibernate配置和映射文件

SessionFactory sessionFactory = config.buildSessionFactory();  生成SessionFactory对象

SessionFactory  接口

会话工厂缓存了生成的sql语句和一些数据

对话在应用初始化时被创建

使用Hibernate访问多个数据库,需要对每个数据库使用一个SessionFactory

 

应用程序从工厂获得Session实例

Configuration config = new Configuration();

config.configure();

SessionFactory sessionFactory =config.buildSessionFactory();

Session  接口

Session 称为持久坏管理器,因为它是与持久化有关的操作连接接口

Session代表与数据库之间的一次操作

Session通过SessionFactory打开,在所有的工作完成后需要关闭

Seesion的使用在只能在一个线程中使用

 

Configuration config =new Configuration().configure();

SessionFactory sessionFactory = config.buildSessionFactory();

Session session = sessionFactory.getCurrentSession();(或者openSession)

 

Session包扩就是对数据库的增删改查

-save()保存

-get()/load();读取 区别get如果没有找到记录返回null   load没有找到,抛出违例

-update()更新

-delete()删除

常见的主要方法: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的缓存中删除该对象。

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

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

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

Transaction  接口

Transaction从底层的事物实现中抽象出来的接口

或许是JDBC事务或者jta的事务这有助保持Hibernate应用在不同类型的执行环境或容器中的可移植性

使用Hibernate进行操作时必须显示的调用Transaction

常见的方法主要有:

1.begin():开始事务

2.commit(): 清空session中的对象,并且更新到数据库中

3.rollback():回滚事务

Seession session=sessionFactory.getCurrentSession();

Transaction tx = session.beginTransaction();

...

tx.commit();

session.close();

Query接口

使用Query类型的对象可以方便我们对数据进行查询,它使用qbc,qbe,hql或者原生sql对数据执行查询操作

Configuration config = new Configuration().configure();

SessionFactory sessionFactory = config.buildSessionFactory();

Session session = sessionFactory.getCurrentSession();

Transaction tx =session.beginTransaction();

Query query =session.createQuery("from table");

List list = query.list();

tx.commit();

Criteria接口

Criteria接口和Query接口类似,它允许我们创建并且执行面向对象方式的查询

Configuration config = new Configuration().configure();

SessionFactory sessionFactory = config.buildSessionFactory();

Session session = sessionFactory.getCurrentSession();

Transaction tx =session.beginTransaction();

Criteria crit =session.createCriteria(Test.class);

Criterion criterion1 = Restrictions.like("name","张%");

crit.add(criterion1);

List list = crit.list();

tx.commit();

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中不同对象,标识不能相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息