Persistence
•
Persistence
类
是用
于
获
取
EntityManagerFactory
实例
。
该类包含一个名
为
createEntityManagerFactory
的
静态方法
。
•
createEntityManagerFactory
方法
有如下两个重载版本
。
–
带有
一个参数的方法
以
JPA
配置文件
persistence.xml
中的
持久化单元名
为
参数
–
带有
两个参数的方
法:前
一个参数含义相同,后一个
参数
Map
类型
,
用于
设置
JPA
的
相关属性
,这时将忽略其它地方设置的属性
。
Map
对象
的属性名必须
是
JPA
实现
库提供商的名字空间约定的属性
名。
EntityManagerFactory
•
EntityManagerFactory
接口
主要
用来创
建
EntityManager
实例
。
该接口约定了如下
4
个方法
:
–
createEntityManager
()
:
用于创建实体管理器对象实例。
–
createEntityManager
(Mapmap)
:
用于创建实体管理器对象实例的重载方法,
Map
参
数用于提
供
EntityManager
的属
性。
–
isOpen
()
:
检
查
EntityManagerFactory
是
否处于打开状态。实体管理器工厂创建后一直处于打开状态,除非调用
close()
方法将其关闭。
–
close()
:
关
闭
EntityManagerFactory
。
EntityManagerFactory
关
闭后将释放所有资源,
isOpen
()
方法测试将
返回
false
,其它方法将不能调用,否则将导致
IllegalStateException
异常
。
EntityManager
•
在
JPA
规范
中
,
EntityManager
是
完成
持
久化操
作的核心对象。
实体作为
普通
Java
对象
,只有在
调用
EntityManager
将
其持久化后才会变成
持久化对象
。
EntityManager
对象
在一
组实
体类与底层数据源之间
进行
O/R
映射
的管理。它可以用来管理和
更新
Entity
Bean
,
根
椐主键
查找
Entity
Bean
,
还
可以通过
JPQL
语句查询实体
。
•
实体
的状态
:
–
新建状态
:
新创建的对象,
尚未拥有持久性主键
。
–
持久化
状态
:已经拥有持久性主键并
和持久化建立了上下文环境
–
游离状态
:
拥有持久化主键,但是没有与持久化建立上下文环
境
–
删除状态
:
拥有持久化主键,已经和持久化建立上下文环境,但是
从
数据库中
删除
。
•
find
(Class<T>
entityClass,Object
primaryKey
)
:
返回指定
的
OID
对应的实体类对象,
如果这个实体存在于当前的持久化环境
,则
返回一个被缓存的
对象;否则
会创建一个新
的
Entity,
并
加载数据库中相关
信息
;
若
OID
不
存在于数据库中,则返回一
个
null
。第一个参数为被查询的
实体类类型
,第二个参数为待查找实体的
主键值
。
•
getReference
(Class<T>
entityClass,Object
primaryKey
)
:
与
find()
方法类似,不同的是:如果缓存中
不存在指定的
Entity,
EntityManager
会
创建一
个
Entity
类
的代理,但是不会立即加载数据库中的信息,
只有第一次
真正使用
此
Entity
的
属性才加载,所以如果
此
OID
在
数据库不存在,
getReference
()
不会返回
null
值
,
而
是抛出
EntityNotFoundException
•
persist
(Object entity)
:
用于将新创建
的
Entity
纳入到
EntityManager
的
管理。该方法执行后,
传入
persist()
方法的
Entity
对象
转换
成
持久化
状态。
–
如果传入
persist()
方法的
Entity
对象
已经
处于
持久化
状态
,
则
persist()
方法什么都
不做
。
–
如果
对删除状态
的
Entity
进行
persist()
操作
,会转换
为
持久化
状态。
–
如果
对游离状态的实体
执行
persist()
操作
,可能会
在
persist()
方法
抛
出
EntityExistException
(
也有可能是在
flush
或事务提交后抛出
)
。
•
remove(Object entity)
:
删除实例
。如果实例是被管理的,即与数据库实体记录关联,则同时会删除关联的数据库记录
。
•
merge (T entity)
:
merge
()
用于处理
Entity
的
同步。即数据库的插入和更新
操作
•
flush()
:
同步
持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。
•
setFlushMode
(
FlushModeType
flushMode
)
:
设置
持久上下文环境的
Flush
模式。参数可以取
2
个
枚举
–
FlushModeType.AUTO
为
自动更新数据库实体
,
–
FlushModeType.COMMIT
为
直到提交事务时才更新数据库记录。
•
getFlushMode
()
:
获取
持久上下文环境的
Flush
模式。返回
FlushModeType
类的枚举值。
•
refresh
(Object entity
)
:
用
数据库实体记录的值更新实体对象的状态,即更新实例的属性值。
•
clear
()
:
清除
持久上下文环境,断开所有关联的实体。如果这时还有未提交的更新则会被撤消。
•
contains
(Object entity
)
:
判断
一个实例是否属于当前持久上下文环境管理的实体
。
•
isOpen
()
:
判断当前的实体管理器是否是打开状态。
•
getTransaction
()
:
返回资源层的事务对象。
EntityTransaction
实例可以用于开始和提交多个事务
。
•
close
()
:
关闭实体管理器。之后若调用实体管理器实例的方法或其派生的查询对象的方法都将抛出
IllegalstateException
异常,除了
getTransaction
和
isOpen
方法
(
返回
false)
。不过,当与实体管理器关联的事务处于活动状态时,调用
close
方法后持久上下文将仍处于被管理状态,直到事务完成。
•
createQuery
(String
qlString
)
:
创建一个查询对象
。
•
createNamedQuery
(String name
)
:
根据
命名的查询语句块创建查询对象。参数为命名的查询语句。
•
createNativeQuery
(String
sqlString
)
:
使用标准
SQL
语句创建查询对象。参数为标准
SQL
语句字符串
。
•
createNativeQuery
(String
sqls
,String
resultSetMapping
)
:
使用
标准
SQL
语句创建查询对象,并指定返回结果
集
Map
的名称
。
EntityTransaction
•
EntityTransaction
接口
用来管理资源层实体管理器的事务操作。通过调用实体管理器的
getTransaction
方
法
获
得其实例
。
•
begin()
–
用于
启动一个事务
,此后的多个数据库操作将作为整体被提交或撤消。若这时事务已启动则会抛
出
IllegalStateException
异常
。
•
commit()
–
用于
提交当前事务
。即将事务启动以后的所有数据库更新操作持久化至数据库中。
•
rollback()
–
撤消
(
回滚
)
当前事务
。即撤消事务启动后的所有数据库更新操作,从而不对数据库产生影响。
•
setRollbackOnly
()
–
使当前事务只能被撤消。
•
getRollbackOnly
()
–
查看当前事务是否设置了只能撤消标志。
•
isActive
()
–
查看当前事务是否是活动的。如果返回
true
则不能调用
begin
方法,否则将抛
出
IllegalStateException
异常
;如果
返回
false
则
不能
调用
commit
、
rollback
、
setRollbackOnly
及
getRollbackOnly
方法
,否则将抛
出
IllegalStateException
异常。