JPA核心

四大主键生成策略

identity

主键自增策略:

  • MySQL推荐使用策略 但是真实开发过程中基本不用 因为兼容性太差
  • 多数数据库支持MySQL, SQL Server, DB2, Derby, Sybase, PostgreSQL。 但是oracle不支持

sequence

类似主键自增:

  • Oracle推荐使用策略 真实开发基本不用 兼容性差
  • 支持的数据库: Oracle、PostgreSQL、DB2

auto

JPA默认的策略

  • 真实开发推荐
  • 它会根据你当前使用的方言来确定,应该是使用identity还是sequence策略

teble

  • 了解 真实开发不用
  • 优点:兼容性超级好
  • 缺点:性能超级差

sequence策略

sequence策略其实就是把主键封装成一个表的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7zQ7yCGd-1579188183081)(mdjs\img\sequence策略.png)]

JPA的状态

为什么要学习jpa的状态

在jpa中的细节很多,如果不学习jpa状态,那么在jpa中很多细节解释不了,我们要了解jpa 必须要学jpa状态

JPA的四大状态

1. 临时状态/瞬时状态

该对象被new出来之后,还没有交给entityManager管理,现在这个对象的状态就叫做临时状态

2. 持久化状态/托管状态

该对象已经和entityManager发生了关系,该对象此时的状态就叫做持久化状态(特点:此时对象必有主键id)

3. 游离状态/脱管状态

管理该对象的entityManager已经关闭 ,该对象没有被entityManager所管理,该对象此时的状态就叫游离状态

4. 删除状态

该对象已经被remove后,此时该对象就处于删除状态

hibernate只有三种状态

  1. 临时状态/瞬时状态
  2. 持久化状态/托管状态
  3. 游离状态/脱管状态

merge的总结

在临时状态下:

当有id的时候:
  • merge查询数据
    • 有对象:
      • 有脏数据—更新
      • 没有脏数据—不进行任何操作(该对象不是持久化对象)
    • 没有对象:
      • 插入数据
没有id的时候
  • 插入数据
  @Test
  public void test1(){
      EntityManager entityManager = JPAUtil.openEntityManager();
      entityManager.getTransaction().begin();
      Statement statement = new Statement();
      statement.setName("leryoo");   //此时的domain还没有交给entityManager管理 还是临时状态
  	//Statement statement = entityManager.find(Statement.class, 1L);这种情况也算是交给entityManager管理
      entityManager.persist(statement);
      System.out.println(statement);//此时的domain已经和EntityManager发生了关系 已经是持久化
      entityManager.getTransaction().commit();
      entityManager.close();
      System.out.println(statement);//此时domain已经脱离了EntityManager的管理 就是游离状态
  }

临时状态对象的数据修改的执行过程

在这里插入图片描述
在这里插入图片描述

脏数据更新

当提交的时候,持久化对象和快照进行比较,比较不相等,则发送更新sql语句,这种效果我们就叫做脏数据更新

JPA状态的改变

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AZjEbTiV-1579188183085)(mdjs\img\JPA状态的改变图.png)]

关系映射

关系认识

  1. 依赖关系
    ex:Controller依赖service层 Service层依赖Dao层

  2. 关联关系

  • 多对一(最常用)
  • 一对多
  • 一对一
  • 多对多

关系映射

导航性
  • 单向
    • 从A方能找到B方,从B方不能找到A方
  • 双向
    • 不管从哪方都能找到对方

注意:不管关联关系是单向还是双向的。在数据库中表的结构是一模一样的,因为在数据表中是不分单向和双向的

小技巧:

怎么判断对象中是写对象还是集合呢?
对象都是1 集合都是多
表的设计:
外键永远都是在多方


注意:保存的时候一定要先保存一的一方再保存多的一方

domain的注解

@ManyToOne(fetch = FetchType.LAZY)
fetche抓取策略:

  • fetch =FetchType.LAZY 懒加载
  • fetch =FetchType.EAGER 迫切加载 如果你不配置,默认就是此值

懒加载:当从数据库取数据的时候,只会加载相关的表
@JoinColumn(name = "dir_id")

  • 当你只写了many2one之后,它自动产生的列名是 xxx_id
  • 自定义外键的列名

JPA的缓存

什么是缓存

用空间换时间
优点:查询性能快
缺点:占用内存

1. 一级缓存

存在entityManager内部

一级缓存命中的条件:
  1. 同一个OID
  2. 同一个entityManager
  3. 同一个entityManagerFactory
2. 二级缓存

存在entityManagerFactory内部

二级缓存命中的条件
  1. 同一个OID
  2. 同一个entityManagerFactory

哪些场景适用缓存

  1. 数据的读取大于修改
  2. 对数据要有独享控制,数据不会被第三方修改
  3. 可以容忍出现无效数据,非关键数据(不是财务数据)
  4. 数据量不能超过内存容量,数据量特别巨大。就不是二级缓存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值