zoukankan      html  css  js  c++  java
  • 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依赖:

    复制代码
    <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>4.2.4.Final</version>
    </dependency>
    <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.2.2.Final</version>
    </dependency>
    <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-annotations</artifactId>
                <version>3.5.6-Final</version>
    </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块来捕获这些异常,也就不会引起用户对这两个异常的重视。

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

    复制代码
    try{ 
        Object o = query.getSingleResult(); 
    } catch (NoResultException ex){ 
        return null; 
    }catch(NonUniqueResultException ex) { 
        o = queryObject.getResultList();
        return ((List)o).get(0);
    }
  • 相关阅读:
    【火炉炼AI】机器学习028-五分钟教你打造机器学习流水线
    【火炉炼AI】机器学习027-项目案例:用聚类算法建立客户细分模型
    【火炉炼AI】机器学习026-股票数据聚类分析-近邻传播算法
    【火炉炼AI】机器学习024-无监督学习模型的性能评估--轮廓系数
    【火炉炼AI】机器学习025-自动估算集群数量-DBSCAN算法
    【火炉炼AI】机器学习023-使用层次聚类算法构建模型
    【火炉炼AI】机器学习022-使用均值漂移聚类算法构建模型
    【火炉炼AI】机器学习021-使用K-means进行图片的矢量量化操作
    A Secret hdu 6153
    Fleet of the Eternal Throne HDU6138
  • 原文地址:https://www.cnblogs.com/xinglongbing521/p/10315409.html
Copyright © 2011-2022 走看看