1.JPA的主键生成策略
@GeneratedValue(strategy = GenerationType.AUTO) -- 默认根据方言来选择(默认)
@GeneratedValue(strategy = GenerationType.IDENTITY) -- ID自增长策略。只能用于支持ID自增长的数据库
@GeneratedValue(strategy = GenerationType.SEQUENCE) --用于有序列的数据库,如Oracle
@GeneratedValue(strategy = GenerationType.TABLE) --兼容性好支持mysql也支持oracle,但是每创建一个表就会生成另一个序列表,性能低
设置了@GeneratedValue主键自增就不要再手动设置主键的值,因为该主键值已经交给jpa进行维护
2.JPA的实体状态
(1)瞬时状态
刚刚new 创建出来,没有和entityManager发生关系
(2)托管状态(持久化状态的数据)
已经和entityManager发生关系 ex:数据被查询出来还没成为脱管或删除状态时就处于持久化状态
(3)脱管状态(游离状态)
已经和entityManager脱离关系
(4)删除状态
如果我们要删除一个内容 remove 这个对象的状态就是删除状态
3.脏数据更新
一个持久化状态的数据,如果修改非主键的值,在commit的时候,会自动发送update语句更新
4.N-To-N问题
一个持久化状态的数据,主键的值被修改
5.实体定义规则
1.实体类不能定义成final类型
2.实体里面的字段,全部声明为包装类型
3.如果实体里面有有参数的构造方法,一定要提供一个无参数构造方法
6.实体之间关系
1.依赖关系
依赖注入:把对象注入到类里面这个过程,就叫依赖注入
2.关联关系
2.1按照内容或者性质来分:
多对一:多个员工属于一个部门
一对多:一个部门下有多个员工
多对多:一个角色(演员 学生 老师) 对应多个权限
一对一:一个人对应一张身份证
2.2按照导航性分:
单向:只能从一方获取另外一个方
双向:可以互相获取
3.组合关系
多对一,或者一对多,整体和部分之间不能被分割(人和身体器官)
4.聚合关系
多对一,或者一对多,整体和部分之间可以被分割(电脑主机和鼠标 键盘 等)
5.泛化关系(体现继承)
7.查询-抓取策略(就是告诉jpa使用什么方式去获取的数据)
多对一抓取策略(推荐使用延迟加载 ,性能要高一点)
@ManyToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
EAGER:急切、迫切 你不管你使用不使用 都把数据查询出来
LAZY:懒加载、延迟 你需要用的才去加载数据 性能要好一点
8.二级缓存
二级缓存的命中条件:
同一个EntityManagerFactory 不同EntityManager 同一个OID
二级缓存使用
导包:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.3.8.Final</version>
</dependency>
配置开启二级缓存:
<!-- 开启二级缓存-->
<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" />
JPA设置Entity缓存的方法:
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
ENABLE_SELECTIVE,默认值,除非被@Cacheable显式声明要缓存,否则默认不缓存
DISABLE_SELECTIVE,除非被@Cacheable显式声明不缓存,否则默认缓存