天天看点

JPA:主键生成和缓存一.主键生成策略二 对应的状态三.对象之间的关系四.单向多对一的配置五 二级缓存

一.主键生成策略

1.1 主键设置两种方式

  • 代理主键(没有业务含义,建议使用)
  • 自然主键(有业务含义:手机号,身份证,…)

1.2 四种主键生成策略

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY/SEQUENCE/AUTO/TABLE)
private Long id;
           

1.2.1 IDENTITY:自增策略

  • 数据库必需支持这种策略
  • MySQL, SQL Server, DB2, Derby, Sybase, PostgreSQL
  • 效率高

1.2.2 SEQUENCE:序列策略

  • 数据库必需支持这种策略
  • Oracle、PostgreSQL、DB2
  • 效率高

1.2.3 AUTO:自动(默认)

  • 默认就是它
  • 根据方言确定策略(IDENTITY,SEQUENCE)

1.2.4 Table:表策略

  • 性能比较低
  • 兼容所有数据库
  • 模拟序列的方式

二 对应的状态

临时,持久,删除,游离
  • 临时:刚创建,和EntityManager没有关系
  • 持久:对象和EntityManager发生关系(一级缓存中)
  • 删除状态(jpa特有的),执行remove(计划删除)
  • 游离:对象和EntityManager解除关系

脏数据更新

一个持久化状态的对象,如果被修改,就会在提交事务的时候被修改
           

持久化对象的OID不允许修改

  • n-to-n的错

dentifier of an instance of cn.itsource._02_state.Employee was altered from 1 to 2

三.对象之间的关系

3.1 依赖关系

  • 类与类之间的依赖关系
  • controller依赖于service ,service依赖于dao

3.2 关连关系

3.2.1 多重性

  • 一对一 (共享主键,唯一的外键【建议】)
  • 多对一 (有外键关系,外键在哪边,哪边就是多方)
  • 一对多 (同上)
  • 多对多 (中间表)

3.2.2 导航性

  • 单向于双向
  • 只用于类(对象),和表没有关系

聚合关系

就是双向的多对一,一对多

组合关系

就是强聚合(整体与部分不可分割)

四.单向多对一的配置

ProductDir
//产品类别
@Entity
@Table(name = "t_productdir")
public class ProductDir {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    //省略getter,setter
}

           
Product
//产品
@Entity
@Table(name = "t_product")
public class Product {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    
    //外键在哪边,哪边就是多方
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="dir_id")
    private ProductDir dir;
    //省略getter,setter
}

           

4.1 注意点

  • 先保存一方,再保存多方(性能更高)
  • 可以配置懒加载提高性能
  • no-session,会话(entityManager)关闭还去拿出数据

五 二级缓存

两个命中

  • 一级缓存命中:同一个EntityManagerFactory,同一个EntityManager,同一个OID
  • 二级缓存命中:同一个EntityManagerFactory,不同EntityManager,同一个OID

什么情况可以使用二级缓存

  • 读取大于修改;
  • 对数据要有独享控制,数据不会被第三方修改;
  • 可以容忍出现无效数据,非关键数据(不是财务数据等)
  • 数据量不能超过内存容量,数据量特别巨大,此时不适合于二级缓存(钝化)