jpa 托管_jpa深入
主键的两种生成策略
a) 主键:区分表里的没一行数据 特点:非空且唯一
b) JPA标准策略有4种:代理主键
i. auto自动策略(MySQL数据库)、默认会根据配置文件中的方言策略来生成主键
ii. table策略、额外创建一张表来维护主键
iii.
sequence序列化策略(只有orcale数据库才支持)、
iv.
identity策略;自增策略,MySQL常用的策略
auto 和 identity的主键生成策略是一样的
主键已经交给JPA维护了之后,就不能自己手动设置主键了
@GeneratedValue方式默认是AUTO策略
c)
余下的都是hibernate自己的策略,包括我们常用的native、uuid7n、assigned、sequence
代理主键和自然主键
a)
代理主键:具有实际意义的列的主键
b)
自然主键:没有实际意义的列来作为主键
JPA持久对象的状态:一个实体交给JPA维护之后的一些状态
a)
瞬时态:刚刚new出来,还没和entityManager对象发生关系
b)
托管态(持久态):已和entityManager对象发生关系,持久态的数据不能修改主键如果改变主键值,会报n-n的错误
c)
游离态:被持久化完毕,entityManager对象关闭资源的时候
d)
删除态:只有调用了entityManager.delete(domain对象)方法
脏数据更新
a)
会在查询一条数据时对其进行备份,如果有对数据非主键的数据进行修改,之后就会对备份的对象和现有对象进行对比,如果相同,就不发送SQL,不相同就重新发送SQL,属于脏数据更新
如果entityManager对象调用了clear()方法,就会将缓存中的数据清除掉,就不会发生脏数据更新
Domain层的定义规则
a)
不能有final修饰(final修饰的类的懒加载会失效)
b)
所有的属性类型必须是包装类型
c)
必须含有无参构造方法
Domain对象(域对象)之间的关系
a)
依赖关系:Controller表现层依赖于Service业务层,Service依赖于Dao持久层
b)
关联关系:注意关联关系的时候不要实例化,相当于没有主键
(private ProductDir dir = new ProductDir();)
否则会报错()
i.
内容或者性质:一对一,一对多,多对一,多对多
一对多:在持久化操作的时候,先保存一方在保存多方比先保存多方再保存一方的效率高(多发SQL语句),
ii.
导航性:单向或双向
单向:只能从一方获取到另一方的数据
双向:双方无论从哪一方都能获取另一方的数据
c)
聚合关系(本质还是双向多对一和一对多)
d)
组合关系(本质还是聚合关系,双向多对一和双向一对多)
e)
一对多的时候要先保存一方在保存多方
Fetch抓取策略
a)
FetchType.EAGER:立即加载(急切的加载,会发关联表的SQL,有左外连接去查询数据)
b)
FetchType.LAZY:懒加载(当需要用到关联表的数据时才会发送SQL),获取持久状态对象之后,还需要获取关联对象,此时才会真正发出sql,获取值,懒加载不能提前关闭entityManager,否 则会报错,使用懒加载的关联对象会在JPA管理下由代理模式生成一个代理对象
可以通过多方.get一方是否为null,来判断是否有外键的关联
缓存的作用:牺牲空间换取时间
缓存的底层是通过map集合来存储数据的,
配置二级缓存方式一
a)
先导入需要的jar包
b)
在persistence.xml中的properties中配置缓存,在properties上面配置二级缓存扫描策略
ENABLE_SELECTIVE//二级缓存扫描策略
配置二级缓存方式二
a)
ehcache.xml配置方式
缓存命中的条件
a)
一级缓存:同一个EntityManagerFactory,同一个EntityManager,OID相同
b) Domain类二级缓存配置的命中条件:同一个EntityManagerFactory,不同一个EntityManager,OID相同,Domain类上面配置@Cacheable(true)
Domain类里面集合的二级缓存配置: 同一个EntityManagerFactory,不同一个EntityManager,OID相同
c) Domain类里面集合上面配置@Cacheable(true)
@Cache(usage =
CacheConcurrencyStrategy.READ_ONLY)
如果配置了domain类里面集合里面的二级缓存,还需要配置domain类里面集合里面泛型对应的 domain类的二级缓存
d)
查询缓存(就是通过JPQL语句进行缓存)配置的话就和二级缓存配置一样
同一个EntityManagerFactory,不同一个EntityManager,发出的sql语句必须相同并且查询的条件值也要相同
如果有查询条件,就不能使用查询缓存,命中率非常低
必须添加代码query.setHint(QueryHints.HINT_CACHEABLE,
true);将数据放入缓存
每个query对象都要加入这句代码
缓存查询数据策略:查询数据时,先从一级缓存拿数据,如果没有,就去二级缓存中拿数据,如果还是没有就从数据库查询数据,这时就会将数据放入一级、二级缓存(前提是要配置了二级缓存), 第二次同一个EntityManager对象去查询同一条数据时,就会先从一级缓存中获取,如果是另一个EntityMananger对象访问同一条数据时,就从二级缓存中去拿
1 二级缓存使用场景
a)
读取大于修改的时候,查询居多时使用二级缓存
b)
读数据要有独享的控制,不能对第三方程序修改
c)
可以容忍一些无效的数据,非关键性数据
d)
如果数据大于内存,不适合放入缓存
1. 缓存淘汰策略
lru:在缓存中找最近很少使用的数据进行淘汰
fifo:最先进入缓存中的数据最先被淘汰
lfu:根据缓存中数据缓存的频率来进行淘汰
jpa 托管_jpa深入相关推荐
- jpa 托管_JPA EntityManager详解(一)
持久化上下文(Persistence Contexts)的相关知识,内容包括如何从Java EE容器中创建EntityManager对象.如何从Java SE中创建EntityManager对象.持久 ...
- jpa 托管_Spring Boot-不是托管类型
我使用Spring boot + JPA,启动服务时遇到问题. Caused by: java.lang.IllegalArgumentException: Not an managed type: ...
- mysql忽略大小写jpa解决_JPA 大小写敏感问题
引言 被舍友问了JPA的查询问题,问题问的我一脸懵逼. 天真的我顺手搭了一个小的JPA项目试一试. 探究 尝试 测试环境:spring-boot 2.1.5.RELEASE.mysql 5.6. 数据 ...
- jpa 托管_java – jpa非托管实体
由于审计日志表共享相同的列,因此可以创建一个"统一"这些表并将单个Java类映射到该视图的视图.我相信你可以,因为你不需要写更新,我想. 作为替代方案,使用本机查询将是一个不错的选 ...
- jpa 托管,Apache Aries托管JPA支持哪些JPA提供程序?
OpenJPA, obviously. I've also seen EclipseLink and Hibernate mentioned, but is there significant dif ...
- jpa 事务嵌套事务_JPA 2 | EntityManagers,事务及其周围的一切
jpa 事务嵌套事务 介绍 对我来说,最令人困惑和不清楚的事情之一是,作为Java开发人员,一直是围绕事务管理的谜团,尤其是JPA如何处理事务管理. 事务什么时候开始,什么时候结束,实体的持久化方式, ...
- jpa多表关联查询_JPA【关联查询篇】
摘要:本文主要介绍JPA的多表关联查询(一对一.一对多.双向关联.多对一.多对多)以及N+1查询的优化. 1. JPA多表关联查询 多表关联查询就是实现使用一个实体类对象操作或者查询多个表的数据. 配 ...
- jpa mysql sql分页查询语句_JPA多条件复杂SQL动态分页查询功能
概述 ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式. 环境 spring ...
- jpa mysql乐观锁_JPA @Lock(value = LockModeType.PESSIMISTIC_WRITE) 悲观锁防坑
前提: 由于业务需要在entity Product已经实现了@version的乐观锁的基础上再加上了悲观锁的控制 @Lock(value = LockModeType.PESSIMISTIC_WRIT ...
最新文章
- c语言实现指定路径文件读取_C语言实现文件复制功能(包括文本文件和二进制文件)...
- Android--WebView显示Html,让其中的图片适应屏幕宽度
- 精通python要多久-小白到精通python要多久
- oracle 控制文件在哪里设置_更改Oracle默认的控制文件设置
- Unix/Linux操作系统中如何在sqlplus/rman中使用方向键
- 十进制转二进制、二进制转十进制
- 在html怎么使用php函数,php htmlentities函数讲解及使用实例
- [转]如何处理机器学习中的不平衡类别
- 在浏览的地址栏中,直接调用js「javascript:alert(hello wrold);」。
- Laravel配置DingoAPI和JWT
- Linux一句话精彩问答-网络无关篇
- 实验五 集线器和交换机的区别
- 尚乘集团联手其蛛网生态圈成员及战略伙伴布局进驻元宇宙
- 一杯咖啡带你读懂状态机
- 国科大学习资料--人工智能原理与算法-第十三次作业解析(学长整理)
- 博客篇-如何使用阿里云搭建网站
- win10 eclipse适配笔记本4K屏幕
- 「Android基于MQTT实现消息通知」
- sequoia中的自动故障处理
- 关于SOM(self-organized map)自组织特征映射神经网络的理解
热门文章
- 【Orangepi Zero2 全志H616】wiringPi外设SDK安装
- 英语文章关于计算机的,关于计算机的英语范文5篇
- [UWP] ExReaderPlus 英语阅读软件
- centOS 7下无法启动网卡(systemctl start network)错误解决办法
- oculus设备VR漫游
- 打开工控机电源而计算机没有反应,工控机的维修方法
- 什么是云计算的基本原理?具体的核心技术有哪些?
- 关于云计算必知的关键核心技术
- UFD203A101 3BHE019361R0101电 工理论、电子技术、信息处理、控制理论、电力系统分析
- 无人驾驶汽车的相关技术,无人驾驶相关技术知识