首页 > 其他分享 >JPA与Hibernate区别及之间的关系

JPA与Hibernate区别及之间的关系

时间:2022-11-01 12:35:00浏览次数:36  
标签:Hibernate 区别 JPA Spring 实现 hibernate entitymanager


分享知识 传递快乐

 

JPA与Hibernate 的区别

JPA和Hibernate之间的最大的区别是:

  • JPA是一个规范,不是框架
  • Hibernate是JPA的实现

也可以简单的理解为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的规范。

下面一结构图充分展示了JPA 与 ORM框架关系:

JPA与Hibernate区别及之间的关系_Hibernate 

 

下面重点介绍一下 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。

 

扩展:

Spring Data JPA是什么?以及相关概述

  • 其次Spring也想要做持久化相关工作,并且已有Spring-data-**这一系列包(Spring-data-jpa,Spring-data-template,Spring-data-mongodb等)。
  • 其中Spring-data-jpa即代表着,Spring框架对JPA的整合。
  • Spring Data JPA是在JPA规范的基础下提供了Repository层的实现。

在项目中的repository层中具体表现为:

1.接口要继承JpaRepository接口示

例代码如下:

@Entity
@Table(name = "t_user")//数据库中表名
public class UserEO {
@Id
@Column(name = "USER_ID")//数据库中字段名
private String userId;

@Column(name = "USER_NAME")
private String userName;

}


@Repository
public interface UserRepository extends JpaRepository<UserEO,String>{//第二个参数是UserEO对应的表的主键类型

//直接定义如下方法,不需要写具体的sql语句
List<UserEO> findByUserName(String userName);

//对于自定义操作(比如更新状态字段为 ‘1’)使用 @Query注解
@Query("update UserEO u set u.status = '1' where u.userName = :userName
void updateStatusByName(String userName);


//此方法 需要拼接条件 在实现类中重写
List<UserEO> findByUserName(Condition condition);

}

2.实现类无需显式实现 UserRepository,只要命名为UserRepositoryImpl即可。

好处在于对于不需要写sql或者sql语句不复杂(使用 @Query 注解可以实现的)的方法,不用重写。

对于需要判断并拼接查询条件的方法,我们可以在实现类中进行重写。

 

 


 

 

——————————
如有不足请留言指正
相互学习,共同进步

标签:Hibernate,区别,JPA,Spring,实现,hibernate,entitymanager
From: https://blog.51cto.com/u_15856116/5813281

相关文章

  • Deer_GF之【AssetsHotfix】和【AssetsNative】文件夹的区别
          Hi,今天介绍一下Deer_Gf里的【AssetsHotfix】和【AssetsNative】文件夹的区别;      框架介绍请移步【Deer_GF之框架介绍】一、【AssetsHotfix】1.存......
  • spring data jpa 外键驼峰命名失效
    有下列实体类:@Data@Table(name="doctors_doctor")@NoArgsConstructorpublicclassDoctorimplementsSerializable{@IdprivateIntegerid;privat......
  • mybatis中${}、 #{}区别及应用场景
    mybatis中${}、#{}区别及应用场景动态sql是mybatis的主要特性之一。在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其进行动态解析。mybatis提供了两种支持动态s......
  • 线程和进程的区别与联系以及单线程多进程与单进程多线程的区别
    线程和进程概念进程(process):是指具有已一定功能的独立程序,是系统资源分配的基本单位,在内存中有其完备的数据空间和代码空间,拥有完整的虚拟空间地址。一个进程所拥有的数据和......
  • Spring-data-jpa介绍
    ORM框架JPA实体Entity,具有ORM元数据的领域对象,POJO是实体的条件:必须使用javax.persistence.Entity注解或XML映射文件中有对应的​​<entity>​​元素;必须具有一个不带参数的......
  • sort和sorted区别
    描述sort与sorted区别: sort是应用在list上的方法,属于列表的成员方法,sorted可以对所有可迭代的对象进行排序操作。list的sort方法返回的是对已经存在的列......
  • Java-equals和“==”的区别
    “==”是比较运算符,可以用于判断基本数据类型是否相等,当用于判断引用类型的时候,比较的对象的内存地址是否相同equals是Object类当中的方法,不可以用于判断基本数据是否相......
  • &,|与&&,||的区别
    ①&和|既是位运算符也是逻辑运算符,&&和||只是逻辑运算符。②&和|作为位运算符时,先把两侧的数转化为二进制再进行位运算;作为逻辑运算符时,会判断每一个表达式的布尔值。③&......
  • [nrf52] low_power_pwm pwm_library pwm_driver 三者区别
    low_power_pwm使用低功耗定时器,功耗低,一个定时器只能支持2路PWMpwm_library使用硬件定时器,功耗高,一个定时器只能支持2路PWMpwm_driver使用PWM外设模块,功耗中等,一个PWM外......
  • sudo与su区别
    一、简介两个命令都允许你获得root权限,但是区别在于如何获得root权限。su[选项]...[-][用户[参数]...]su(switchuser的缩写)将身份变成其他用户。当该命令不加任何参数时......