什么是JPA:
JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,是一套java ORM框架的实现规范
相关介绍:
JPA百度百科
JPA基础(一):全面阐释和精彩总结JPA
JPA的好处:
有诸多实现框架 可以很方便的切换实现,也是java ORM框架的发展趋势,JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,他不能取代现有的Hibernate,TopLink等ORM框架。相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。
1.类级别注解:
注解 | 描述 |
---|---|
@Entity | 映射实体类 |
@Table | 映射数句库表 |
属性参数及描述:
注解 | 属性 | 可选 | 描述 |
---|---|---|---|
@Entity | name | 是 | 对应数据库中的一个表。若表名与实体类名相同,则可以省略。 |
@Table | name | 是 | 功能同上 |
@Table | catalog | 是 | 表示Catalog名称,默认为 Catalog(“”)。 |
@Table | schema | 是 | 表示Schema名称 , 默认为Schema(“”)。 |
2.属性级别注解:
注解 | 描述 |
---|---|
@Id | 映射生成主键 |
@Version | 定义乐观锁 |
@Column | 映射表的列 |
@Transient | 定义暂态属性 |
属性参数及描述:
注解 | 属性 | 可选 | 描述 |
---|---|---|---|
@Id | - | - | 定义了映射到数据库表的主键的属性 |
@Version | - | - | 以在实体bean中使用@Version注解,通过这种方式可添加对乐观锁定的支持 |
@Column | name | 是 | 表示数据库表中该字段的名称,默认情形属性名称一致 |
@Column | nullable | 是 | 表示该字段是否允许为 null,默认为 true |
@Column | unique | 是 | 表示该字段是否是唯一标识,默认为 false |
@Column | length | 是 | 表示该字段的大小,仅对 String 类型的字段有效,默认值255 |
@Column | insertable | 是 | 表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为 true |
@Column | updateable | 是 | 表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为 true |
@Column | columnDefinition | 是 | 表示该字段在数据库中的实际类型 ,指定映射类型 |
@Transient | - | - | 表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性 |
2.1.扩展
注解 | 描述 |
---|---|
@GeneratedValue | 用于定义主键生成策略 |
@Basic | 用于声明属性的存取策略 |
@Temporal | 用于定义映射到数据库的时间精度 |
属性参数及描述:
注解 | 属性 | 可选 | 值 | 描述 |
---|---|---|---|---|
@GeneratedValue | strategy | 是 | GenerationType.AUTO | 根据底层数据库自动选择(默认) |
@GeneratedValue | strategy | 是 | GenerationType.INDENTITY | 根据数据库的Identity字段生成 |
@GeneratedValue | strategy | 是 | GenerationType.SEQUENCE | 使用Sequence来决定主键的取值 |
@GeneratedValue | strategy | 是 | GenerationType.TABLE | 使用指定表来决定主键取值,结合@TableGenerator使用 |
@GeneratedValue | Generator | 是 | _ | 表示主键生成器的名称,这个属性通常和ORM框架相关 , 例如:Hibernate 可以指定 uuid 等主键生成方式 |
@Basic | fetch | 是 | FetchType.EAGER | 即时获取(默认的存取策略) |
@Basic | fetch | 是 | FetchType.LAZY | 延迟获取 |
@Temporal | TemporalType | 是 | DATE | 日期 |
@Temporal | TemporalType | 是 | TIME | 时间 |
@Temporal | TemporalType | 是 | TIMESTAMP | 两者兼具 |
3.映射继承关系:
注解 | 描述 |
---|---|
@Inheritance | 定义所选择的策略. 这个注解需要在每个类层次结构(class hierarchy) 最顶端的实体类上使用 |
4.映射实体bean的关联关系:
注解 | 描述 |
---|---|
@OneToOne | 定义一对一 |
@OneToMany | 定义一对多 |
@ManyToOne | 定义多对一 |
@ManyToMany | 定义多对多 |
@OneToOne、@OneToMany、@ManyToOne、ManyToMany的共有属性及描述:
属性 | 值 | 描述 |
---|---|---|
fetch | Fetch.EAGER | 及时加载,多对一默认是Fetch.EAGER |
fetch | Fetch.LAZY | 延迟加载,一对多默认是Fetch.LAZY |
cascade | CascadeType.PERSIST | 保存 |
cascade | CascadeType.REMOVE | 删除 |
cascade | CascadeType.MERGE | 修改 |
cascade | CascadeType.REFRESH | 刷新 |
cascade | CascadeType.ALL | 全部 |
targetEntity | _ | 配置集合属性类型,如:@OneToMany(targetEntity=Book.class) |
其他属性及描述:
属性 | 描述 |
---|---|
mappedBy | 用在双向关联中,把关系的维护权翻转 委托给对方维护 |
4.1.扩展
表之间的级联:
注解 | 描述 |
---|---|
@JoinTable | 用于定义中间表, 产生级联表,将双方的主键存放在一张独立的表中 |
@JoinColumn | 用于定义关联字段, 不产生级联表,将一方的主键存放在另一方的表中 |
在单向关系中没有mappedBy,主控方相当于拥有指向另一方的外键的一方。
1.一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。
2.一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。
3.多对多中,joinColumns写的都是本表在中间表的外键名称, inverseJoinColumns写的是另一个表在中间表的外键名称。
5.嵌入字段与复合主键:
注解 | 级别 | 描述 |
---|---|---|
@Embeddable | 类级别注解 | 说明这个就是一个可被嵌套的类 |
@Embedded | 方法及字段级别注解 | 用于标明嵌入字段 |
@EmbeddedId | 方法及字段级别注解 | 用于标明嵌入字段为复合主键 |
6.扩展:
注解 | 级别 | 描述 | 使用 |
---|---|---|---|
@SecondaryTables | 类级别注解 | 将一个实体类映射到数据库两张或更多表中 | 配合@colum注解的table 属性使用 |
案例:Hibernate,JPA 对象关系映射之简单映射策略
属性参数及描述:
注解 | 属性 | 描述 |
---|---|---|
@SecondaryTables | @SecondaryTable[] | 标注表名 |
更多JPA注解:
JPA 注解使用
參考链接:
Hibernate注解方法使用总结(引用大半)
@JoinTable和@JoinColumn
Hibernate,JPA 对象关系映射之简单映射策略