首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JPA 课程(三)

2012-08-31 
JPA 教程(三)JPA的编程结构及重要的API JavaEE 5.0中所定义的JPA接口个数并不多,它们位于javax.persistenc

JPA 教程(三)

JPA的编程结构及重要的API

JavaEE 5.0中所定义的JPA接口个数并不多,它们位于javax.persistence和javax.persistence.spi两个包中。 javax.persistence包中大部分API都是注解类,除此之外还包括EntityManager、Query等持久化操作接口。

而 javax.persistence.spi包中的4个API,是JPA的服务层接口。

?

下面,我们就来认识一下这些重要的接口

?

EntityManager的类型实体对象由实体管理器进行管理,JPA使用javax.persistence.EntityManager代表实体管理器。

实体管理器和持久化上下文关联,持久化上下文是一系列实体的管理环境,我们通过EntityManager和持久化上下文进行交互。

?

有两种类型的实体管理器:

容器型:容器型的实体管理器由容器负责实体管理器之间的协作,在一个JTA事务中,一个实体管理器的持久化上下文的状态会自动广播到所有使用EntityManager的应用程序组件中。Java EE应用服务器提供的就是管理型的实体管理器;

应用程序型:实体管理器的生命周期由应用程序控制,应用程序通过javax.persistence.EntityManagerFactory的createEntityManager创建EntityManager实例。

?

EntityManager的创建过程
javax.persistence.spi.PersistenceProvider接口由JPA的实现者提供,该接口由启动者调用,以便创建一个EntityManagerFactory实例。

?

它定义了创建一个EntityManagerFactory实例的方法:
EntityManagerFactorycreateContainerEntityManagerFactory(PersistenceUnitInfo info, Map map)
javax.persistence.spi.PersistenceUnitInfo入参提供了创建实体管理器所需要的所有信息,这些信息根据JPA的规范,必须放置在META-INF/persistence.xml文件中。


PersistenceUnitInfo接口拥有了一个void addTransformer(ClassTransformer transformer)方法,通过该方式可以添加一个javax.persistence.spi.ClassTransformer,并通过 PersistenceProvider开放给容器,以便容器在实体类文件加载到JVM之前进行代码的增强,使元数据生效。

?

JPA厂商负责提供 ClassTransformer接口的实现。

?

实体的状态
实体对象拥有以下4个状态,这些状态通过调用EntityManager接口方法发生迁移:
新建态:新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联起来。

受控态:已经拥有持久化主键并和持久化上下文建立了联系;

游离态:拥有持久化主键,但尚未和持久化上下文建立联系;

删除态:拥有持久化主键,已经和持久化上下文建立联系,但已经被安排从数据库中删除。

?

EntityManager 的API

?

SELECT p FROM PollOption p JOIN p.pollTopic t WHERE t.topicId = :topicId

?

小结

在不久的将来,Sun可能会将JPA作为一个单独的JSR对待,同时JPA还可能作为Java SE的一部分。不过这些都不太重要,重要的是,我们现在已经可以在脱离容器的情况下、在Java SE应用中使用JPA了。
JPA已经作为一项对象持久化的标准,不但可以获得Java EE应用服务器的支持,还可以直接在Java SE中使用。开发者将无需在现有多种ORM框架中艰难地选择, 这对开发人员来说是个福音。

热点排行