hibernate_体系结构

本文详细介绍了Hibernate中的关键对象,包括sessionFactory、session和持久化对象。阐述了持久化对象的三种状态——瞬时态、持久态和脱管态,以及它们之间的转换。此外,还提及了事务、ConnectionProvider和TransactionFactory的角色。通过对实例的分析,解释了不同状态下对象的保存和更新行为。
摘要由CSDN通过智能技术生成

1) sessionFactory

这是hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,也是线程安全的,它是生成Session的工厂。该对象可以在进程或集群的级别上,为那些事务自己可以重用的数据提供可选的二级缓存。

Hibernate.cfg.xml配置文件中所有配置都会在sessionFactory中得到注册。

 

2) session

它是应用程序与持久层实现交互操作的一个单线程对象,它也是Hibernate持久化操作的关键对象,所有的持久化对象必须在Session管理下才可以进行持久化操作。此对象生存期很短,它底层封装了jdbc链接,它也是Transaction的工厂,Session对象持有必选的一级缓存,在显示执行flush之前,所有的持久化操作的数据都在缓存中的Session对象处。

 

3) 持久化对象(Persistent Object)

系统创建的POJO实例,一旦与特定的Session关联,并对应数据表的指定记录,该对象就处于持久化状态。

Hibernate的对象有3种状态,分别为:

瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。

处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

A:瞬时态

New(POJO)开辟内存空间的java对象,

Person person = new Person("amigo", "女");

如果没有变量对该对象进行引用,它将被java虚拟机回收。

瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。

B:持久态

   处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。

   当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

   持久对象具有如下特点:

   1. 和session实例关联;

   2. 在数据库中有与之关联的记录。

C:脱管态

    当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

    脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

   脱管对象具有如下特点:

   1.  本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;

   2.  比瞬时对象多了一个数据库记录标识值。

D: 事务(Transaction)

代表一次原子操作,它具有数据库事务的概念,Hibernate事务是对底层具体的JDBC,JTA以及CORBA事务的抽象。

E: ConnectionProvider

它是生产JDBC连接的工厂,它通过抽象将应用程序与底层DataSource或者DriverManager隔离开.在设计应用很少使用DriverManager来链接数据库,通常都会使用DataSource来获取数据库连接,因此ConnectionProvider通常由DataSource来充当,由于SessionFactory底层封装了ConnectionProvider,也可以说是SessionFactory底层封装了DataSource.

F: 事务工厂(TransactionFactory)

它是生成Transaction对象实例的工厂,该对象也无须应用程序直接访问,它负责对底层具体的事务实现进行封装,将底层具体的事务抽象成Hibernate事务。

 

4) 三态实例

如果要和数据库打交道,必须为持久态。

New一个对象是临时态(瞬时态)。

Transaction tx = session.beginTransaction();

User user = new User();// 临时态

user.setName("lisi");  

user.setAge(28);

user.setBirth(new Date());

session.save(user);// 转为持久态

tx.commit();

运行程序,执行save方法时后台输出:

 

Save的返回值是记录的主键。Save方法执行后user对象的主键id也被赋上了值,如:

Serializable serial = session.save(user);// 转为持久态

System.out.println("id:"+user.getId());

System.out.println(serial);

 

那么转为持久态后有什么区别呢,如果此时修改对象内容会发生什么呢?

session.save(user);// 转为持久态

user.setName("wangwu");

tx.commit();

会发现后台有两条输出语句:

 

表中的数据也保存的是wangwu,而不是lisi

Sessionclear方法会将对象转为脱管态。

session.save(user);// 转为持久态

session.clear();// 转为脱管

user.setName("赵六");

tx.commit();

此时后台输出只有insert,没有update

 

同时表中的数据也不是“赵六”,说明clear后修改的内容没有保存到库中。

Session的另一个方法evict,和clear一样,只是evict是清除某一特定对象,clear是清除全部。

session.save(user);// 转为持久态

session.evict(user);// 转为脱管

//session.clear();

user.setName("赵六");

tx.commit();

结果也和上面一样,插入了一条记录,名称为lisi,而不是赵六。

由脱管态转回持久态

session.save(user);// 转为持久态

session.evict(user);// 转为脱管态

user.setName("赵六");

session.update(user);// 转为持久态

tx.commit();

 

库中多了一条赵六的记录。

在后面和spring进行集成的时候,事务的提交、session的关闭都不需要我们写代码了。后面再介绍。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值