B站 尚硅谷 jpa 初级入门 https://www.bilibili.com/video/BV1vW411M7zp?p=6
简介
JPA java persistence API 用于对象持久化API
统一java应用程序访问ORM的方式,是ORM的一种规范,不是ORM框架
JPA是hibernate的一个抽象:JPA是规范,hibernate是实现
JPA是注解式的,JPQL查询语言
JPA使用步骤
创建工程,导入依赖(hibernate的require里的包)
1.创建persisitence.xml文件(persistence-unit标签下properties标签)
-
指定交互数据库(driver、url、user、pwd)
-
指定JPA使用那个持久化框架和配置框架基本属性(properties-生成数据表的策略hbm2db.auto、显示和格式化sql ;provider标签-配置PersistenceProvider的实现类比如hibernatePersistenceProvider)
2.创建实体类,使用annotation来描述实体类和db表之间的映射关系
配置注解
-
表@Entity @Table(name=)
-
字段@Id @GennerrateValue(strategy=)@column(字段名一样不用写)
-
配置文件,添加持久化类(class标签,类名)
3.使用JPA API 增删改查
-
创建EntityManagerFactory(对应hibernate的sessionFactory)
-
创建EntityMangager(对应hibernate的session)
-
开启事务
-
持久化操作
-
提交事务
-
关闭EntityMangager
-
关闭EntityManagerFactory
基本注解
@Entity 映射实体类和db表,表名和类名不一样加@Table
@Id 主键 @GennerrateValue 主键生成策略
MYSQL对应auto sqlserver对应identity
-AUTO jpa默认选项
-IDENTITY 数据库ID自增方式,oracle不支持
-SEQUENCE 通过序列产生主键 @SequenceGennerator注解指定序列名,mysql不支持
-TABLE 通过表产生主键,矿建借由表模拟序列产生主键,放标数据库移植
@Basic 表示类属性到db表的字段映射,对没有注解的get方法,默认basic,所以加不加都行
-fetch:属性读取策略,有eager和lazy,表示主支抓取和延迟加载。默认eager
-option:属性是否允许为null,默认true允许
@column
实体属性和db表的字段不同时使用,可以和@Id一起使用
常用属性是name,映射表名。还有unique、nullable、length,
这个注解可以用getter方法上
@Transient
工具方法,不需要映射为数据表的一列。因为默认@Basic的,所以工具方法需要加这个注解
@Temporal
确定Date类型的精度,数据库中Date精度为DATE\TIME\TIMESTAMP对应日期、时间和两者兼备。用这个注解调整精度
Tbale 主键生成策略 用的不多
TODO
JPA API
persistence类是用于获取entitymanagerfactory实例,该类包含静态方法createentitymanagerFactory,这个方法两个重载版本:
-带有一个参数方法以jpa配置文件persistence.xml中持久化单元名为参数
-带有两个参数的方法:前一个参数一样,后一个map是jpa相关属性
entitymanagerfactory接口主要用来创建entitymanager实例。主要四个方法
1.创建2.带配置创建3.判断是否开启4.关闭factory
增删改查API
find方法:调用就查询(类似hibernate的get)
getReference方法:懒加载,使用时候再查询。如果连接关闭后再调用,会出现代理加载异常
(类似hibernate的load方法)
save方法:hibernate保存,如果有就插入
persistence方法:保存,对象有id则会抛出异常,不会insert
delete:hibernate的,可以删除持久化对象和游离对象。
remove方法:删除db持久化对象,但是不能移除游离对象。想删除可以先find,关联对象,再删除
实体状态:
-新建:未拥有持久化主键,也叫临时态/子哟态
-持久化:拥有持久化主键,持久化简历了上下文环境,加入了session缓存中内外部状态都有。例如save方法
-游离状态:拥有持久化主键,但是没有持久化建立上下文环境。不再处于session缓存中,有内外部状态,由手工管理内外部状态同步,当session关闭时候
-删除状态:拥有持久化主键,持久化建立上下文环境,但是从数据库中删除
hibernate参考图
merge(T entity) 数据库插入更新操作 saveorupdate,返回T
1.T临时对象,没有主键。创建一个新的对象,把java中的临时临时对象属性copy到新对象中,然后对新对象持久化,执行一个insert
2.T游离对象,有主键。若entitymananger缓存中没有对象,且db中没有对应记录,jpa会创建一个新对象,然后把当前游离对象属性赋值到新对象中,对新对象执行insert
3.T游离对象,若entitymananger缓存中没有对象,db有对应记录,jpa会查询对应记录,返回记录的一个对象,然后把游离对象属性复制到这个返回对象中,然后对这个对象update
4.T游离对象,缓存中有对应对象,jpa把游离对象属性复制到缓存对象中,对其update
hibernate中session不能对两个相同id关联,这里是错误的,但是jpa会查询复制。
EM 方法
、
hibernate参考图
flush()方法
和hibernatesession的flush方法一样,将save update delete等方法信息同步到db中,并清空缓存。如果不提交事务,只flush,执行sql,但是db信息不改变。
setFlushMode(FlushModeType flushMode)设置持久化上下文环境的FlUSH模式,参数取2个枚举
-FlushModeType .AUTO 自动更新db实体
-FlushModeType .COMMIT 为直到提交事务才更新db记录
getFlushMode():获取持久化上下文的Flush模式,返回FlushModeType类的枚举值
refresh(entity)更新实例属性值从db
clear()清除持久化上下文,端开所有关联实体,未提交的更新会被撤消
contains(entity) 判断实例是否属于上下文环境管理的实体
isopen()判断当前entitymanager是否打开
getTransaction()返回资源层的事务对象。entityTransaction实例用于开始和提交多个事务
close()关闭entitymanager。关闭后使用em都会抛出IllegalstateException异常,除了getTransaction()和isopen(返回false)。不过调用EM在事务完成之前处于被管理状态。
EntityTransaction 事务
该接口用于EM的事务操作,通过getTransaction()获得实例
JPA需要getTransaction-beggin-commit事务
hibernate:beggin-commit
commit() rollback()
setRollbackOnly() 当前事务只能被撤销
getRollbackOnly()查看当前事务是否设置成上面那个条件