JPA初体验系列(二) 实体管理器简介

EntityManager 是用来对实体Bean 进行操作的辅助类。他可以用来产生/删除持久化的实体Bean,通过主键查找实体Bean,也可以通过EJB3 QL语言查找满足条件的Bean。实体Bean 被EntityManager管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean的时候便会把发生改变的值同步到数据库中。

实体管理器是JPA中很重要的部分,它的具体功能和作用如下:

JPA初体验系列(二) 实体管理器简介_第1张图片


从图中可以看出,实体管理器与数据库交互主要体现在两方面:

一是负责将Java中的实体对象操作转换成数据库识别的SQL脚本。

二是负责执行的面向实体查询的JQL转化成SQL脚本,并将返回的查询结果组装成实体。


(1) public void persist(Object entity)
    作用:将记录保存到数据库记录
    
(2) public <T>T merge(T entity)

    作用:更新数据库记录

(3) public void remove(Object entity)

    作用:删除实体,将实体从数据库中删除。

(4) public <T> T find(Class<T> entityClass,Object primaryKey)

    作用:通过实体主键查找实体对象。

(5)public void flush()
    作用:将持久哈上下文实体保存到数据库,实现与数据库同步。
(6)public void refresh(Object entity)
    作用: 刷新实体Bean,以得到最新对象
(7) public boolean contains(Object entity)
    作用:检测当前实体是否被管理
(8)Find(*.class, ID) :若实体Bean不存在,则返回null

两种类型的EntityManager对象

1.容器托管

不需要考虑EntityManager连接的释放,以及事务这些问题都交给容器去管理。容器托管的EntityManager对象必须在EJB容器中运行,而不能再Web容器和J2SE的环境中运行。EntityMnager对象都是通过注入@PersistenceContext注释来获得。

    
容器托管的EntityManager代码:
    @PersistenceContext(unitName = "basic-entity")
        protected EntityManager em;


2.应用托管
   程序员需要手动控制释放和连接、手动控制事务。这种方式不仅可以在EJB容器中应用,也可以使JPA脱离EJB容器,而与任何的Java环境集成,比如说Web容器、J2SE环境等。 所以从某种角度上来说,这种方式是JPA 能够独立于EJB环境运行的基础。

 应用托管的EntityManager代码:
    // 当前登录用户拥有的实体单元名称
    protected String unitName = "basic-entityTest";
    // 创建实体管理器工厂A
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(unitName);
// 创建实体管理器A
        EntityManager em = emf.createEntityManager();

我们公司最近做的项目中,业务需要实现动态切换数据源,也就是实现动态切换实体单元名称,所以需要将原来由容器管理的EntityManager 改为应用托管的EntityManager,但是这样造成JTA事务无法使用,需要手动实现JTA分布式事务,但是这样JTA分布式事务就脱离EJB容器独立存在了,EJB的所有服务就都不能使用了。

你可能感兴趣的:(JPA初体验系列(二) 实体管理器简介)