【jpa】简介和项目生成、API-初级入门

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()查看当前事务是否设置成上面那个条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值