一.主键生成策略
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
什么情况可以使用二级缓存
- 读取大于修改;
- 对数据要有独享控制,数据不会被第三方修改;
- 可以容忍出现无效数据,非关键数据(不是财务数据等)
- 数据量不能超过内存容量,数据量特别巨大,此时不适合于二级缓存(钝化)