前言
从本节我们开始进入到对于Hibernate框架的学习,当前Hibernate框架还未正式发布6.0稳定版本,所以这里我们以5.4.12Final版本进行讲解。
Hibernate框架
Hibernate是一个对象/关系映射(ORM)解决方案, 对象关系映射或对象关系管理是将应用程序域模型对象映射到关系数据库表的编程技术,它是基于Java的ORM框架,用于将应用程序域对象映射到关系数据库表,Hibernate提供了对Java Persistence API(JPA)的实现或提供程序以及自身所提供的API,使其成为具有松散耦合优势的ORM工具的绝佳选择,我们可以利用Hibernate的持久性API用于CRUD操作,同时Hibernate框架也提供了一个选项,可以使用JPA注解以及基于XML的配置将POJO对象映射到关系数据库表。Java Persistence API(JPA)提供了用于管理应用程序中的关系数据的规范,JPA规范是通过javax.persistence包中的注解而定义的,使用JPA注解有助于我们编写独立于实现的代码,Hibernate通过使用JDBC与数据库进行交互。以下是Hibernate架构示意图:
Hibernate作为ORM解决方案,它作为Java应用程序数据访问层和关系数据库之间的桥梁,Java应用程序利用Hibernate API来加载,存储,查询等等其域数据。 作为JPA提供程序,Hibernate实现Java Persistence API规范,我们可以在下图中直观地看到JPA接口与Hibernate特定实现之间的关联:
SessionFactory (org.hibernate.SessionFactory)
应用程序域模型到数据库的映射的线程安全(且不可变)表示形式。它作为org.hibernate.Session实例的工厂,EntityManagerFactory和JPA的SessionFactory等效,此二者最终还是会会聚到同一个SessionFactory实现中,创建一个SessionFactory的开销非常大,因为SessionFactory维护所有Session中使用的服务,例如二级缓存,连接池,事务系统集成等,所以,对于任何给定的数据库,该应用程序应该仅具有一个关联的SessionFactory。
Session (org.hibernate.Session)
单线程且作为短生命周期对象在概念上为“工作单元”建模。它通过JPA中的EntityManager而表示,在背后,Hibernate会话包装了JDBC java.sql.Connection并充当org.hibernate.Transaction实例的工厂,它维护应用程序域模型的一般“可重复读取”持久性上下文(一级缓存)。
Transaction (org.hibernate.Transaction)
单线程且作为短生命周期对象用于划分应用程序的单个物理事务边界。它作为抽象API,以将应用程序与使用中的基础事务系统(JDBC或JTA)进行有效隔离。
Hibernate框架优点
【1】它消除了JDBC附带的所有模板代码,让我们更专注于业务逻辑。
【2】它提供对XML以及JPA注解的支持,使我们的代码实现完全独立。
【3】它提供与SQL类似的强大查询语言(HQL)且完全面向对象。
【4】它是Red Hat Community的一个开源项目,已在全球范围内使用,因此这是一个更好的选择,因为学习曲线很小,并且有大量的在线文档,并且可以在论坛中轻松获得帮助。
【5】它易于与其他Java EE框架集成,因此非常流行,Spring框架也提供了将Hibernate与Spring应用程序集成的内置支持。
【6】它支持使用代理对象进行延迟加载,并且仅在需要时才执行实际的数据库查询。
【7】它提供缓存有助于我们获得更好的性能。
Hibernate与JDBC相比有什么优势?
【1】它消除了JDBC API附带的许多模板代码,更清晰易读。
【2】它支持继承,关联和集合,而JDBC API不提供这些功能。
【3】它隐式提供事务管理,实际上,大多数查询无法在事务外部执行,而在JDBC API中,我们需要使用commit和rollback编写用于事务管理的代码。由于JDBC API会抛出SQLException,这是一个已检查的异常,因此我们需要编写许多try-catch块代码,在大多数情况下,它在每个JDBC调用中都是多余的, Hibernate封装了JDBC异常并抛出JDBCException或HibernateException未经检查的异常,因此我们不需要编写代码来处理它,同时Hibernate内置的事务管理消除了try-catch块的使用。
【4】它提供查询语言(HQL)且更加面向对象,与Java编程语言非常接近,而对于JDBC,我们需要编写本机SQL查询。
【5】它支持更好的性能缓存,而JDBC查询不会进行缓存,因此性能很低。
【6】它提供了一个选项,通过它我们也可以创建数据库表,而JDBC表必须存在于数据库中。
【7】它所提供的配置有助于我们将JDBC之类的连接以及JNDI DataSource用于连接池,这是企业应用程序中非常重要的功能,而JDBC API完全没有。
【8】它支持JPA注解,因此代码与实现无关,并且可以轻松地用其他ORM工具进行替换,JDBC代码与应用程序紧密结合。
总结
本节我们初步认识Hibernate框架的架构、优点以及对比JDBC其强大优势,从下一节我们开始正式进入Hibernate框架的学习。