JPA API
1. Persistence
createEntityManagerFactory
方法- 该方法就是这个类的最主要的作用:创建
EntityManagerFactory
对象,它需要传入你配置文件中配置的persistence-unit
的name
属性的值 - 重载方法:有两个参数(不常用,了解即可)
- 第一个:配置文件中的
persistence-unit
的name
属性的值 - 第二个:Map类型,用于设置 JPA 的相关属性。如果提供这个参数,将忽略其他地方设置的同名属性。
- Map 对象的属性名必须是JPA实现库提供商约定的属性名
- 第一个:配置文件中的
- 该方法就是这个类的最主要的作用:创建
2. EntityManagerFactory
- 类似于
hibernate
中的SessionFactory
createEntityManager
方法- 用于创建
EntityManager
对象
- 用于创建
close
方法- 用于关闭
EntityManagerFactory
对象,释放资源
- 用于关闭
3. EntityManager
- 类似于
hibernate
中的Session
- 持久层对象的状态(与
hibernate
一样)- 新建:新创建的对象,尚未拥有持久化主键
- 持久化:已经拥有持久化主键并和持久化建立了上下文环境
- 游离:拥有持久化主键,但是没有与持久化环境建立上下文环境
- 删除:拥有持久化主键,已经和持久化建立上下文环境,但是已经从数据库中删除
-
<T> T find(Class<T> entityClass, Object primaryKey)
-
根据主键查询对象
-
类似于
hibernate
中Session
的get
方法:立即加载
-
-
<T> T getReference(Class<T> entityClass, Object primaryKey)
-
根据主键查询对象
-
类似于
hibernate
中Session
的load
方法:懒加载 -
查询到的对象的类型:
cn.ann.entity.User_$$_jvst368_0
----> 是一个代理对象- 代表着:在使用这个对象之前,
EntityManager
不能关闭,否则会报 no session 异常,和hibernate
一样
- 代表着:在使用这个对象之前,
-
-
void persist(Object entity)
:前提是设置了主键生成策略- 类似于
hibernate
中Session
的save
方法:使对象转换为持久态 - 与
hibernate
中Session
中的save()
的不同:如果对象有id
,不能执行 insert 操作,会报异常
- 类似于
-
void remove(Object entity)
- 类似于
hibernate
中Session
的delete()
:从数据库中移除对象 - 不同的是:它只能移除持久化对象,
hibernate
的delete
也可以删除游离态对象
- 类似于
-
<T> T merge(T entity)
- 总的来说:类似于
hibernate
中Session
的saveOrUpdate
方法- 若传入一个临时对象
- 会创建一个新的对象,把临时对象的属性复制到新的对象中,然后i对新的对象进行持久化操作,所以新的对象中有 id,但是传入的临时对象没有
- 若传入的是一个游离对象:传入的对象有id
- 若在
EntityManager
缓存中没有该对象,数据库中也没有对应的记录,JPA会创建一个新的对象,然后把当前游离对象的属性复制到新创建的对象中,然后对新创建的对象执行持久化操作(相当于id无效) - 若在
EntityManager
缓存中没有该对象,但是数据库中有对应的记录,JPA会查询对应记录,然后把当前游离对象的属性复制到查询出来的对象中,然后对查询的对象执行update
操作 - 若在
EntityManager
缓存中有对应的对象,JPA会把游离对象的属性复制到EntityManager
缓存中的对象中,然后对缓存中的对象执行update
操作
- 若在
- 若传入一个临时对象
- 相同点在于:
hibernate
和 JPA 的两个方法都不能同时关联两个id一样的持久态对象 - 不同在于:hibernate没有复制的操作,所以,执行更新操作的时候会直接报异常,但是 JPA 有复制的操作,更新操作可以执行
- 总的来说:类似于
-
其他方法
void flush()
- 强制发送sql语句,同步持久上下文环境,需要事务,但是不需要事务提交
void setFlushMode(FlushModeType flushMode)
- 设置持久上下文环境的
flush
模式,参数:- FlushModeType.AUTO:自动更新数据库实体
- FlushModeType.COMMIT:直到提交事务时才会更新数据库记录
- 设置持久上下文环境的
FlushModeType getFlushMode()
- 获取持久上下文环境的
flush
模式
- 获取持久上下文环境的
void refresh(Object entity)
- 用数据库实体记录的值更新实体对象的状态,即:更新实例的属性值
void clear()
- 清除持久上下文环境,断开所有关联的实体。会撤销未提交的更新
boolean contains(Object entity)
- 判断一个实例是否属于当前持久上下文环境管理的实体
boolean isOpen()
- 判断当前实体管理器是否是打开状态
EntityTransaction getTransaction()
- 返回资源层的事务对象,返回的对象可以用于开始和提交多个事务
void close()
- 关闭实体管理器。
-
和查询语句相关
Query createQuery(String qlString)
- 创建一个查询对象
Query createNamedQuery(String name)
- 根据命名的查询语句块创建查询对象。参数为命名的查询语句
Query createNativeQuery(String sqlString)
- 使用标准的sql语句创建查询对象。参数为标准的sql语句字符串
Query createNativeQuery(String sqlString, String resultSetMapping)
- 使用标准的sql语句创建查询对象,并指定返回结果集Map的名称
-
EntityTransaction:其实就是JPA里面的事务
void begin()
- 开启事务。与hibernate的区别是该方法并不会返回事务对象,就意味着必须先获取到事务对象才能进行操作
void commit()
- 提交事务
void rollback()
- 回滚事务
本节代码点击此处