JPA和Hibernate的关系
原址:http://hi.baidu.com/tianpaomian/blog/item/fd618bdeed8ef55394ee375d.html
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的规范。
下面重点介绍一下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块来捕获这些异常,也就不会引起用户对这两个异常的重视。
目前解决这个问题我使用的方法是
try{ Object o = query.getSingleResult(); } catch (NoResultException
ex){ return null; } catch(NonUniqueResultException ex) { o =
queryObject.getResultList();return ((List)o).get(0);}
分享到:
相关推荐
现在引入了一组全新的 API:Java Persistence API JPA 以允许开发者管理 Java EE(甚至 SE)应用程序中的关系数据 另外 Sun 声称 Java Persistence API 表现了一些 Hibernate TopLink(二者都会在稍后讨论) JDO ...
NULL 博文链接:https://prowl.iteye.com/blog/519618
Alura-Java和JPA课程:使用JPA2和Hibernate持久化对象 这是我在课程之后开发的代码。 我已经对原始版本进行了一些更改。 内容 JPA和Hibernate简介 使用数据库 面向对象范式 在Java代码中避免使用SQL JDBC和SQL维护...
Hibernate之JPA注解
示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...
总之,后端是用 Java 编写的,它连接到后端内存中关系数据库 (HSQL)。也可以连接到其他关系数据库(MySQL)。应用程序由 Spring 框架搭建。模型-视图-控制器 (MVC) 架构模式用于将前端与后端分离。这是通过 ...
hibernate的中关系映射分为一对一、一对多、多对一、多对多,其中有单双向之分。而一对一还有主键和外键区分。一共是九种。分别用xml配置文件和annotation实现。annotation的版本没有写测试程序,见谅。
Spring Hibernate JPA与常用JAR包详解,非常全面,将每个包的依赖包也有详细的说明
想象一下,有一个工具可以自动检测您是否正确使用了JPA和Hibernate。 不再有性能问题,也不必花费大量时间试图弄清为什么您的应用程序几乎无法爬网。 想象一下在开发周期的早期发现您正在使用次优的映射和实体关系...
Hibernate和JPA JPA(Java持久性API)作为处理关系数据库的框架存在于Java EE中。 在开发JPA之前,Hibernate已作为开源开发。Hibernate的出现引起了当时正努力编写SQL的Java工程师的极大关注。 最终,像Hibernate...
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML...JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致 同时JPA也是JavaEE5 (EJB) 3.0 规范的组成部分。 这个文档是针对JPA常用注解的一些说明。
实用JPA开发指南实用JPA开发指南实用JPA开发指南实用JPA开发指南实用JPA开发指南实用JPA开发指南实用JPA开发指南实用JPA开发指南
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述...JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致 同时JPA也是JavaEE5 (EJB) 3.0 规范的组成部分。 这个文档是针对JPA常用注解的一些说明。
Hibernate是开始做暑假的比赛项目之前学的第一门新技术(花了半天啃了大半本书),可惜最后项目用的是JPA。Hibernate是现在企业运用的最主流持久层中间件技术,恩,貌似可以这么说吧。 和JDBC比较一下,同样都是...
javafx11-jpa-crud该项目演示了将JavaFX和JPA(Java Persistence API)技术与Hibernate结合使用的桌面应用程序。旨在改善我的逻辑而创建的项目完全是由我开发的,没有任何预先计划。一切都是根据不断出现的需求来...
Spring Data JPA是Spring基于Hibernate...如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更进一步,为我们做了 一个数据持久层框架几乎能做的任何事情。
CRUD-HibernateJPA JPA: Java Persistence API是标准... Hibernate: Hibernate是一种用Java语言编写的对象关系映射框架,它通过使用文件(XML)或Java注释来促进传统关系数据库和应用程序的对象模型之间的属性映射。
Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。