目录
目录 1
一、JPA基础 2
1.1 JPA基础 2
1.2JPA开发过程 3
1.3 实体的生命周期及实体管理器常用方法 4
二、环境搭建 5
2.1 添加JPA支持 6
2.2 添加配置文件 6
2.3测试配置 6
2.4 环境搭建附表 6
三、常用注解 12
3.1 批注完全参考 12
3.2 ID相关的 12
3.3主键生成策略 13
3.4字段、添加字段、添加表关联 13
3.5映射相关 14
3.6其他 14
四、JPA映射 14
4.1一对一映射 15
4.1.1共享主键映射 15
4.1.2关联外键映射 17
4.1.3添加表关联 17
4.2一对多关联 18
4.2.1添加字段的一对多、多对一关联 18
4.2.2添加表的一对多、多对一关联 19
4.3多对多关联 20
4.4继承映射 21
五、JPQL 21
六、常见异常 22
一、JPA基础
1.1 JPA基础
JPA: java persistence api 支持XML、JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范
元数据:对象和表之间的映射关系
实体: entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字
游离状态实体以值方式进行传递,需要serializable
JPA是一套规范、有很多框架支持(如Hibernate3.2以上、Toplink,一般用Hibernate就行 oracle可以用toplink)
JPQL
1、与数据库无关的,基于实体的查询语言
2、操作的是抽象持久化模型
3、JPQL是一种强类型语言,一个JPQL语句中每个表达式都有类型
4、EJBQL的扩展
5、支持projection(可以查询某个实体的字段而不需要查询整个实体)、批量操作(update、delete)、子查询、join、group by having(group by聚合后 having 聚合函数 比较 条件)
弱类型语言:没有明显的类型、根据情况变化、容易出错
强类型语言:没个变量都有固定的类型。不容易出错
虽然JPA规范中明确表示无法访问一个集合关系字段
抽象模型类型:JPQL规范将一个实体(属性)中所饮食的各种类型称为抽象模型类型
状态字段
关联字段
查询多个字段查出来的是个对象值数组
1.2JPA开发过程
JPA配置文件声明持久化单元 --> 配置文件persistence.xml
编写带标注的实体类
编写Dao类
xml配置
事务类型分为:RESOURCE_LOCAL
本地事务、JTA(java事务API)
注解
@Entity 将JavaBean标注为一个实体 name属性
@Table 数据库中的表,name名称、catalog数据库名 @Secondary Table/@Secondary Tables多个表
@Id 定义了实体的主键信息
@GeneratedValue逐渐省城策略
@GeneratedValue(Strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name="SEQ_TEST",sequenceName="User_SEQ",allocationSize=25)
@column 属性、字段对应的表字段
@Temporal 属性是时间类型的话可以细分
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
@Lob 标注CLOB、BLOB
@Base 是否延迟加载@Base(fetch = FETCHTYPE.LAZY/FETCHTYPE.EAGER)
@Transient 实体bean中,所有非static、非transient状态变量、字段都要被持久化
如果有字段、变量在数据库中没有对应,标注为transient就可以不被持久化
标注方式: 标注在字段上
标注在变量上
实体类写法:
1、必须有无参的构造函数
2、没有final类型的变量或方法
3、不可以是public类型的,只能通过get、set方法读写
管理实体
Persistence
EntityManagerFactory
EntityManager
Persistence.createEntityManagerFactory('persistence.xml中配置的persistence unit').createEntityManager()获取EntityManager
1.3 实体的生命周期及实体管理器常用方法
EntityManager声明周期 Java对象 实体管理器 数据库
1、 新实体(new) 存在 不存在 不存在
2、持久化实体(managed) 存在 存在 存在
3、分离的实体(detached) 不存在 不存在 存在
4、删除的实体(removed) 存在 存在 不存在
new
↓persist()
find() ↓ commit()、clear()
DB → → → → → → managed → → → → → → detached
↓ ←merge()
↓
↓remove()
removed
常用方法
1、persist(Object) 持久化
2、remove(Object) 删除对象
3、find(Class entityClass,Object key) 根据主键查询
4、flush() 实体与底层同步,执行sql
5、createQuery() 创建JPQL查询对象
5、createNativeQuery() 根据普通SQL查询
5、createNamedQuery() 命名查询@NamedQuerie标注
5、merge(Object) 将一个detached的实体持久化到EntityManager中
5、close() 关闭管理器
———————————————————————————————————————
javax.persistence.Query
int executeUpdate() 执行更新、删除、添加
Object getSingleResult() 执行查询(返回一条记录)
List getResultList() 执行查询(返回结果链表)
Query setParameter(int position,object value) 给Query对象设置参数
Query setMaxResults(int maxResult) 给Query对象设置返回数
Query setFirstResult(int firstResult) 给Query对象设置返回偏移
参数查询(只能用一种)
命名参数查询 "select u from User where id = :uid"; setParameter("uid",value);
位置参数查询
------------------------------------------------------------
Person person = em.find(Person.class,1);
//相当于Hibernate的get
Person person = em.getReference(Person.class,1);
//相当于Hibernate的load返回一个代理对象
//注意延迟加载时的 事务没关闭的时候才好用
find 如果找不到返回的是个null,这时候下面在调用null的方法报nullpoint异常
reference相当于延迟加载 如果找不到,会在第一次使用就报EntityNotFound异常
回调函数(相当于拦截器,下面的方法执行前后调用指定的方法)
@Prepersist
@PostPersist
@PreRemove
@PostRemove
@PreUpdate
@PostUpdate
@PostLoad 载入实体时(find、查询、refresh)
-----------------------------------------------------------------
二、环境搭建
2.1 添加JPA支持
1、准备JPA用到的jar包(JPA支持包)
2、window → preferences → Java → BuildPath → User Libraries
→new User Library
→Add Jars
3、项目 →