1. JPA的主键生成策略(了解)
1.1主键
定义:被挑选出来,作表的行的唯一标识的候选关键字
特点:非空且唯一
分类:
代理主键 :没有实际意义的一些列作为主键
自然主键 :具体实际意义的列作为的主键
1.2 JPA主键生成策略
@Id
@GeneratedValue
private Long id;
GeneratedValue:默认使用 等效于(strategy = GenerationType.AUTO)自己会根据你的配置的方言 来选择使用的生成策略 -- 主键自增mysql --序列(常用)
注意:如果使用@GeneratedValue ,保存数据时不设置id的值,因为id这个主键值已经交给jpa进行维护
2 JPA的实体状态
2.1JPA几大状态
(1)瞬时状态:刚刚new 创建出来,没有和entityManager发生关系
(2)托管状态(持久状态):已经和entityManager发生关系
(3)脱管状态(游离状态):已经和entityManager脱离关系
(4)删除状态:如果我们要删除一个内容 remove 这个对象的状态就是删除状态
2.2脏数据更新 --允许存在
一个持久化状态的数据,如果修改非主键的值,在commit的时候,会自动发送update语句更新
2.3 n-to-n问题
持久化状态的主键的值被修改产生的问题
2.4实体定义规则
(1)实体类不能定义成final类型 --最终 不能被继承
(2)实体里面的字段 全部包装类型 底层很多代码都是判断 是否为null
(3)如果实体里面有有参数的构造方法,一定要提供一个无参数构造方法
3 实体之间关系
3.1有哪些关系
(1)依赖关系
依赖注入DI:把对象注入到类里面这个过程 就叫依赖注入 (IOC控制反转)
(2)关联关系
按照内容或者性质来分:多对一,一对多
按照导航性分:单向,双向
(3)组合关系
多对一 或者一对多 整体和部分之间,整体和部分不能分割
(4)聚合关系
多对一 或者一对多 整体和部分之间,整体和部分可以分开存在
(5)泛化关系
体现继承
3.2 查询-抓取策略
抓取策略 fetch:告诉jpa使用什么方式获取数据
配置: @ManyToOne(fetch = FetchType.EAGER/LAZY)
EAGER:急jiazai你不管你使用不使用 都把数据查询出来
LAZY:懒加载 需要用的 才去加载数据 (性能要好一点)
注意:实体类不要定义成final类型
4 二级缓存
缓存:把数据下载到本地
程序里面:先从数据库把数据查询出来,放入缓存里面(内存Map),下来查询数据的时候,先从缓存里找,如果有,直接取出,如果没有,在发送sql查询数据,放入缓存
目的:提高查询效率
一级缓存命中条件:同一个EntityManagerFactory 同一个EntityManager 同一个OID
二级缓存命中条件:同一个EntityManagerFactory 不同EntityManager 同一个OID
查询缓存命中条件:同一个EntityManagerFactory 不同的EntityManager 发出jpql语句相同,条件值相同; 用的很少,条件值相同情况下 很少,命中很低
二级缓存使用
(1)导包
(2)配置 --底层ehcache这个框架完成
在perisistenc.xml配置
<!-- 开启二级缓存-->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<!--二级缓存实现类-->
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
<!--查询缓存-->
<property name="hibernate.cache.use_query_cache" value="true" />
扫描策略
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
5 缓存理论
5.1 什么时候使用二级缓存
(1)读取大于修改(查询居多 修改很少);如果经常修改数据,缓存里面数据也需要修改 ,也要同步
(2) 你要对数据 有独享控制,不能被第三方程序改变,不然数据就会出现脏数据
(3)这个数据必须能够容忍一些错误,太精确的数据不适合放入缓存(金额)日志信息
(4)缓存数据量不要超过内存容器,超过不能存下来,但是有NB框架,实现==钝化==的效果内存数据量满了之后,会存入磁盘 -- ehcahe