JPA和Hibernate的关系

JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分。

Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的超集。

JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。那么Hibernate是如何实现与JPA的这种关系的呢。

Hibernate主要是通过三个组件来实现的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。

hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation。

hibernate-core是Hibernate的核心实现,提供了Hibernate所有的核心功能。

hibernate-entitymanager实现了标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。

Maven依赖:

复制代码

1<dependency> 2 <groupId>org.hibernate</groupId> 3 <artifactId>hibernate-entitymanager</artifactId> 4 <version>4.2.4.Final</version> 5</dependency> 6<dependency> 7 <groupId>org.hibernate</groupId> 8 <artifactId>hibernate-core</artifactId> 9 <version>5.2.2.Final</version> 10</dependency> 11<dependency> 12 <groupId>org.hibernate</groupId> 13 <artifactId>hibernate-annotations</artifactId> 14 <version>3.5.6-Final</version> 15</dependency>

复制代码

下面重点介绍一下hibernate-entitymanager包的主要类及实现。

HibernatePersistence.java,实现了JPA的PersistenceProvider接口,它提供createEntityManagerFactory和createContainerEntityManagerFactory两个方法来创建EntityManagerFactory对象,这两个方法底层都是调用的EJB3Configuration对象的buildEntityManagerFactory方法,来解析JPA配置文件persistence.xml,,并创建EntityManagerFactory对象。

EntityManagerFactory对象的实现是EntityManagerFactoryImpl类,这个类有一个最重要的private属性就是Hibernate的核心对象之一SessionFactory。这个类最重要的方法是createEntityManager,来返回EntityMnagaer对象,而sessionFactory属性也传入了该方法。

EntityManager对象的实现是EntityManagerImpl类,这个类继承自AbstractEntityManagerImpl类,在AbstractEntityManager类中有一个抽象方法getSession来获得Hibernate的Session对象,正是在这个Session对象的实际支持下,EntityManagerImpl类实现了JPA的EntityManager接口的所有方法,并完成实际的ORM操作。

此外,hibernate-entitymanager包中还有QueryImpl类利用EntityManagerImpl的支持实现了JPA的Query接口;TransactionImpl利用EntityManagerImpl的支持实现了JPA的EntityTransaction接口。

至此,Hibernate通过hibernate-entitymanager包完成了对于JPA的全部支持工作。

最后,补充一个让我感到意外的问题:

JPA中的Query对象的getSingleResult()方法,当查询不到结果时,抛出NoResultException、当查询到多个结果时,抛出NonUniqueResultException;并且NoResultException和NonUniqueResultException都是RuntimeException。

这样有两个问题:

1、我认为getSingleResult方法应该允许查询不到结果的情况存在的,此时它返回null即可,没有必要抛出异常;

2、即使需要在查询不到结果或者查询到多个结果时抛出异常,也不应该抛出RuntimeException,因为这样表示不需要代码显示的用try-catch块来捕获这些异常,也就不会引起用户对这两个异常的重视。

目前解决这个问题我使用的方法是

复制代码

1try{ 2 Object o = query.getSingleResult(); 3} catch (NoResultException ex){ 4 return null; 5}catch(NonUniqueResultException ex) { 6 o = queryObject.getResultList(); 7 return ((List)o).get(0); 8}
点赞
收藏

评论区

加载中...

相关推荐

jdbc、jpa、spring data jpa、hibernate、mybatis之间的关系及区别

基础概念jdbc(JavaDataBaseConnectivity)是java连接数据库操作的原生接口。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为各个数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。一句话概括:jdbc是所有

Spring Boot下使用JPA报错:'hibernate.dialect' not set的解决办法

SpringBoot 下使用JPA,报org.hibernate.HibernateException:AccesstoDialectResolutionInfocannotbenullwhen'hibernate.dialect'notset错误,异常信息如下:Causedby:org.hibernate.Hiber

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

什么么是JPA?全称JavaPersistenceAPI,可以通过注解或者XML描述【对象关系表】之间的映射关系,并将实体对象持久化到数据库中。为我们提供了:1)ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;如:@Entity、@Table、@C

Spring Boot(五):Spring Boot Jpa 的使用

一、SpringBootJpa简介Jpa(JavaPersistenceAPI)是sun官方提出的java持久化规范。它为java开发人员提供了一种对象/关联映射工具,来管理java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在hibernate、toplink、jdo等ORM框架各自为营的局面。

SpringBoot之JPA

前言:用Spring全家桶,大家常用的应该是jpa,上次我看过一次调查统计,歪果人使用持久化框架jpa比较多,目前国内已知互联网公司mybatis会比较多,可能大家都觉得mybatis的查询效率更高。 SpringDataJPA只是SpringData中的一个子模块,JPA是一套标准接口,而Hibernate是JPA的实现,SpringDataJPA底

Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8

一、SpringDataJPA介绍JPA(JavaPersistenceAPI)Java持久化API,是Java持久化的标准规范,Hibernate是持久化规范的技术实现,而SpringDataJPA是在Hibernate基础上封装的一款框架。开发环境Spring