初识hibernate——基础与核心

来源:互联网 发布:淘宝客活动可以取消吗 编辑:程序博客网 时间:2024/05/21 22:37

  在学习hibernate之前,做系统时经常会遇到一些类似这样的问题:我们系统中的实体类和数据库表差不多80%相似,但是我们不得不把数据库表转换成我们需要的实体类,并且需要把数据库读出来的数据转换为需要实体类;或者我们会遇到迁移数据库的问题,导致系统当是写的代码与数据库不匹配等等,可是,系统和数据库本来应该是两个相对独立的东西,不能让一个程序完全依赖于某一个数据库,系统和数据库的关系应该像是现在的手机和万能充电器一样,某牌子的智能手机并不依赖于某种牌子的充电器,而我们做系统也是一样的,不同的客户有不同牌子的手机,我们要把我们的系统做成一个可以调压的万能充电器。Hibernate就致力于实现这些功能,他可以让我们随心所欲的操纵数据库

 

我所学到的Hibernate

  下面一点点介绍Hibernate,首先我们学到的是对hibernate的基本了解

 

Hibernate简介

  Hibernate是一个开放源代码的对象关系映射框架ORM,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

 

Hibernate的核心

  Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五个核心接口分别加以介绍。

  Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。

 

SessionFactory接口:SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

 

Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。

 

Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。

 

Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。

 

hibernate的三种状态

 

 1. 瞬时状态 (Transient)

  当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:

 

Customer customer=newCustomer(“zx”,27,images);


  这时customer对象就处于自由状态,为什么说customer对象处于自由状态呢?这是因为,此时customer只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说customer对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记 录。

瞬时对象特点:

  (1) 不和 Session 实例关联

  (2)在数据库中没有和瞬时对象关联的记录

2. 持久状态 (Persistent)

  持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。如下所示:

Customercustomer=new Customer(“zx”,27,images);tx=session.beginTransaction();session.save(customer);customer=(Customer)session.load(Customer.class,”1”);customer.setAge(28);tx.commit();


 

  这时我们并没有显示调用session.update()方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时customer对象通过save方法保存进数据库后,已经是持久化对象了,然后通过load方法再次加载它,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时当执行tx.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到 到数据库中。

  持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier).

  持久对象总是与 Session 和Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏 (dirty) 对象。

瞬时对象转为持久对象:

  (1) 通过 Session 的save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。

  (2) 使用fine(),get(),load() 和 iterater() 待方法查询到的数据对象,将成为持久化对象。

持久化对象的特点:

  (1) 和 Session 实例关联

  (2) 在数据库中有和持久对象关联的记录

3. 脱管状态 (Detached)

  当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可

Customercustomer=new Customer(“zx”,27,images);tx=session.beginTransaction();session.save(customer);customer=(Customer)session.load(Customer.class,”1”);customer.setAge(28);tx.commit();session.close();


能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。如下所示:

 

  当session关闭后,customer对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与customer对象对应的数据记录,所以此时customer对象处于游离态

  与持久对象关联的 Session被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。

脱管对象特点:

  (1) 本质上和瞬时对象相同

  (2)只是比爱瞬时对象多了一个数据库记录标识值 id.

持久对象转为脱管对象:

  当执行 close() 或clear(),evict() 之后,持久对象会变为脱管对象。

瞬时对象转为持久对象:

  通过 Session 的update(),saveOrUpdate() 和 lock() 等方法,把脱管对象变为持久对象。

 

优缺点:

优点

  提高生产力

  是开发更加对象化(阻抗不匹配)

  可移植性

  没有侵入性,支持透明持久化

缺点:

  使用数据库特性的语句,将很难调优

  对大批量数据更新存在问题

  系统中存在大量的统计查询功能

 

总结

  通过对hibernate的基本了解,我们可以简单的了解他的工作原理,虽然我们写代码的时候不会去想这个语句这样写用的是什么原理,但是他对于我们更好知道hibernate的工作原理,追根溯源,不要做只懂得写代码的程序猿

 

原创粉丝点击