JPA知识详解

JPA简介

JPA定义:

  • Java Persistence API:用于对象持久化的 API
  • Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层
    在这里插入图片描述
  • JPA 是 hibernate 的一个抽象(就像JDBC和JDBC驱动的关系)
  • JPA 是规范:JPA 本质上就是一种 ORM 规范,不是ORM 框架 —— 因为 JPA 并未提供 ORM实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现
  • Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现从功能上来说,JPA 是Hibernate 功能的一个子集
  • JPA 的目标之一是制定一个可以由很多供应商实现的 API,目前Hibernate 3.2+、TopLink 10.1+ 以及OpenJPA 都提供了 JPA 的实现。
    ①Hibernate:JPA 的始作俑者就是 Hibernate 的作者,Hibernate 从 3.2 开始兼容 JPA
    ②OpenJPA:OpenJPA 是 Apache 组织提供的开源项目
    ③TopLink:TopLink 以前需要收费,如今开源了

JPA的优势:

  • 标准化: 提供相同的 API,这保证了基于JPA 开发的企业应用能够经过少量的修改就能够在不同的 JPA 框架下运行。
  • 简单易用,集成方便: JPA 的主要目标之一就是提供更加简单的编程模型,在 JPA 框架下创建实体和创建 Java 类一样简单,只需要使用 javax.persistence.Entity 进行注释;JPA 的框架和接口也都非常简单。
  • 可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
  • 支持面向对象的高级特性: JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面向对象的模型。

JPA 包括 3方面的技术:

  • ORM 映射元数据:JPA 支持 XML 和 JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
  • JPA 的 API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的 JDBC和 SQL代码中解脱出来。
  • 查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的 SQL紧密耦合。

JPA使用

使用JPA持久化对象的步骤:

  • 创建 persistence.xml, 在这个文件中配置持久化单元
    ①需要指定跟哪个数据库进行交互;
    ②需要指定 JPA 使用哪个持久化的框架以及配置该框架的基本属性
  • 创建实体类, 使用 annotation 来描述实体类跟数据库表之间的映射关系
  • 使用 JPA API 完成数据增加、删除、修改和查询操作
    ①创建 EntityManagerFactory (对应 Hibernate 中的 SessionFactory);
    ②创建 EntityManager (对应 Hibernate 中的Session);
  • 引入的依赖:hibernate-jpa-2.1-api.jar
    其中javax.persistence这个包的作用是持久化的作用,具体的说就是在实体类中进行元数据标签的作用,ORM框架可以通过这个元数据标签,使得实体类与数据库中的表建立映射关系。

persistence.xml使用:

  • JPA 规范要求在类路径的 META-INF 目录下放置persistence.xml,文件的名称是固定的
  • hibernate.hbm2ddl.auto的几个常用属性值:
    实际项目中 update 用的多一点,因为它只更新对象关系的变化,不会清空数据或者重建表。
    <1>none:默认值,什么都不做,每次启动项目,不会对数据库进行任何验证和操作
    <2>create:每次运行项目,没有表会新建表,如果表内有数据会被清空
    <3>create-drop:每次程序结束的时候会清空表
    <4>update:每次运行程序,没有表会新建表,但是表内有数据不会被清空,只会更新表结构。
    <5>validate:运行程序会校验数据与数据库的字段类型是否相同,不同会报错
    JPA默认情况下和MyBatis一样开启一级缓存。JPA是针对与entityManager,Mybatis是针对于sqlSession。
    JPA的二级缓存是跨entityManager的,JPA的二级缓存需要显式配置。
<persistence>
<!-- 
	一、name 属性用于定义持久化单元的名字, 必选。
	二、transaction-type:指定 JPA  的事务处理策略。RESOURCE_LOCAL:默认值,数据库级别的事务,只能针对一种数据库,不支持分布式事务。
	如果需要支持分布式事务,使用JTA:transaction-type="JTA“
-->
	<persistence-unit name="jpa-1" transaction-type="RESOURCE_LOCAL">
		<!-- 
			配置使用什么 ORM 产品来作为 JPA 的实现 
			1. 实际上配置的是  javax.persistence.spi.PersistenceProvider 接口的实现类
			2. 若 JPA 项目中只有一个 JPA 的实现产品, 则也可以不配置该节点. 
		-->
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
	
		<!-- 添加持久化类 -->
		<class>com.atguigu.jpa.helloworld.Customer</class>
		<class>com.atguigu.jpa.helloworld.Order</class>
	
		<class>com.atguigu.jpa.helloworld.Department</class>
		<class>com.atguigu.jpa.helloworld.Manager</class>
	
		<class>com.atguigu.jpa.helloworld.Item</class>
		<class>com.atguigu.jpa.helloworld.Category</class>
		
		<!-- 
			配置二级缓存的策略 
			ALL:所有的实体类都被缓存
			NONE:所有的实体类都不被缓存. 
			ENABLE_SELECTIVE:标识 @Cacheable(true) 注解的实体类将被缓存
			DISABLE_SELECTIVE:缓存除标识 @Cacheable(false) 以外的所有实体类
			UNSPECIFIED:默认值,JPA 产品默认值将被使用
		-->
		<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
	
		<properties>
			<!-- 连接数据库的基本信息 -->
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
			<property name="javax.persistence.jdbc.user" value="root"/
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值