注:此为个人学习笔记,内容可能有些混乱,仅供参考。
1、关系
关系可以是双向或单向的。双向关系同时具有持有端( owning side )和反向端( inverse side )。单向关系只有一个持有端。
2、关系持有者
MappedBy 元素指出实体中作为关系的主控端的属性/字段。 在非持有端注明 ,类似于表明交出控制权。
一对多 / 多对一双向关系中的 “多”端必须是持有端 ,(在一对多时,外键建在多的一端)因此不能在 ManyToOne 注解中使用 mappedBy 元素。
对于一对一双向关系,包含对应的外键( foreign key )的那一端是持有端。
对于多对多双向关系,任一端都可以作为持有端。
3、级联
关系模型注解限制对 cascade=REMOVE 的使用。 cascade=REMOVE 只应该用 OneToOne 或 OneToMany 关系上,对其它类型的关系应用 cascade=REMOVE 是不可移植的。
4、实体实例的生命周期
一个实体实例的状态可以被分为 new, managed, detached 或 removed 。
• 一个新创建的实体实例没有持久化标识,并且还没有与一个持久化上下文相关联。
• 一个受管的实体实例有一个正与持久化上下文相关联的持久化标识。
• 一个脱管的实体实例有持久化标识,但这个标识没有(或已经不再)与一个持久化上下文相关联。
• 被删除的实体实例具有持久化标识,并且与持久化上下文相关联,但是已经被计划从数据库中删除。
5、持久化Entity实例
persist 保存
remove 删除
merge 将脱管实体的状态传递到由EntityManager管理的持久实体。
contains 确认一个实体的实例是不是当前持久化上下文中的受管对象。
6、级联加载
同cascade注解一样,fetch只应该用在OneToOne、OneToMany关系上,默认为lazy。
7、事件监听
在实体类上加监听方法,有以下各种注解申明方法执行的时间
@PrePersist @PostPersist
@PreRemove @PostRemove
@PreUpdate @PostUpdate
8、一些注解
@OrderBy 用于指定一个集合值的关联在被获取时,其中元素的排序。
@Temporal 在java.util.Date和java.util.Calendar类型的持久字段/属性上必须指定Temporal注解,它也只能用于这些类型。
9、注意
所有未用 Transient 标注的属性都是持久化的。属性访问方法必须是 public
或 protected 。当使用基于属性的访问时,实体的对象 / 关系映射注解标注在 getter 方法上。