1.1 JPA
(1)JPA是一套java持久化规范; 而hibernate实现了JPA规范.
(2)在hibernate中, 有两套操作数据库的方式, 一套是hibernate自己特有的方式, 还有一套是实现了JPA规范的方式
2. 常用API
(1)EntityManagerFactory : 他是JAP规范中生产EntityManager的工厂, 要保证一个工程中只有一个EntityManagerFactory. 等于SessionFactory
(2)EntityManager : 实体类管理器, 用来做CRUD的. 等于 session
(3)Persistence : JPA规范中的工具类, 用于获取EntityManagerFactory的
(4)EntityTransaction : JPA规范中的事务接口, 用来管理JPA规范中的事务. 等于Transaction
(5)EntityManager.persist() : 用来保存对象的. 等于session.save()
3. 常用注解
在实体类上加JPA注解, 取代传统的hbm.xml 文件的功能.
(1) @Entity : 如果在一个类上加此注解, 表示该类是一个实体类
(2) @Table : 指定该类所映射的表, name属性表示该类所映射的表名. 如果类名与表名一致, 此注解可以省略
(3) @Id : 表示与主键列对应的属性
(4)GeneratedValue : 表示主键如何生成. strategy属性: 指定主键生成的策略.
(5)@Column : 指定实体类属性和数据库表里列之间的对应关系
属性: 1.name: 指定数据库表的列名
2.unique: 是否唯一
3.nullable: 是否可以为空
4.insertable: 是否可以插入
5.updateable: 是否可以更新
6.columnDefinition: 定义建表时创建此列的DDL
7.secondaryTable: 从表名. 如果此列不在主表上(默认建在主表上), 该属性定义该列所在从表的名字
3.1 主键生成策略
@GeneratedValue: 为一个实体类生成一个唯一标识的主键(JPA要求每一个Entity, 必须有且只有一个主键). 它有两个属性, 分别是strategy和generator.
generator: 默认为空字符串, 它定义了主键生成器的名称, 对应的生成器有两个: 对应于同名的主键生成器@SequenceGenerator和@TableGenerator
strategy: 一共有四种, 被定义在枚举Generation中, 包括: TABLE, SEQUENCE, IDENTITU, AUTO
(1)IDENTITY : 主键由数据库自动生成(自动增长型)
(2)SEQUENCE: 根据底层数据库的序列来生成主键, 条件是数据库支持序列
(3)AUTO: 根据底层数据库自动选择一种策略
(4)TABLE: 使用一个特定的数据库表格来保存主键
注: 配置文件要在src下新建META-INF文件夹,新建persistence.xml文件。
4. 一对多关系常用注解
(1)@OneToMany : 建立一对多关系映射
属性
targetEntityClass : 指定多的一方的类的字节码
mappedBy : 指定从表实体类中引用主表对象的名称. 让主表(一方)放弃外键维护
cascade : 指定要使用的级联操作
fetch : 指定是否采用延迟加载
orphanRemoval : 是否使用孤儿删除
(2)@ManyToOne : 建立多对一的关系
属性
targetEntityClass : 指定一的一方实体类字节码
cascade : 指定要使用的级联操作
fetch : 指定是否采用延迟加载
optional : 关联是否可选. 如何设置为false, 则必须始终存在非空关系
(3) @JionColumn : 用于定义主键字段和外键字段的对应关系
属性
name : 指定外键字段的名称
referencedColumnName : 指定引用主表的主键字段的名称
unique : 是否唯一, 默认值不唯一
nullable : 是否允许为空, 默认值允许
insertable : 是否允许插入, 默认只允许
updateble : 是否允许更新, 默认值允许
columnDefinition : 列的定义信息
5. JPA里的对象导航查询
在JPA中, 查询一方延迟加载多方数据, 这点和xml配置时一样的. 而查询多方立即加载一方数据, 这点和xml正好是相反的. 我们不需要改变这种情况, 因为我们就是需要查询多方立即加载一方数据
提示: 如果想改变默认的抓取策略, 可以给OneToMany、ManyToOne注解加 fetch 属性, fetch属性有两个值
(1) EAGER: 表示立即加载
(2) LAZY: 表示延迟加载