`
pengwei841221
  • 浏览: 70984 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

JPA 教程(三)

    博客分类:
  • 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

 

void persist(Object entity)

通过调用EntityManager的persist()方法,新实体实例将转换为受控状态。这意谓着当persist ()方法所在的事务提交时,实体的数据将保存到数据库中。如果实体已经被持久化,那么调用persist()操作不会发生任何事情。如果对一个已经删除的实体调用persist()操作,删除态的实体又转变为受控态。如果对游离状的实体执行persist()操作,将抛出 IllegalArgumentException。

在一个实体上调用persist()操作,将广播到和实体关联的实体上,执行相应的级联持久化操作;

 

void remove(Object entity)

通过调用remove()方法删除一个受控的实体。如果实体声明为级联删除(cascade=REMOVE 或者cascade=ALL ),被关联的实体也会被删除。在一个新建状态的实体上调用remove()操作,将被忽略。如果在游离实体上调用remove()操作,将抛出 IllegalArgumentException,相关的事务将回滚。 如果在已经删除的实体上执行remove()操作,也会被忽略;

 

void flush()

将受控态的实体数据同步到数据库中;

 

T merge(T entity)

 将一个游离态的实体持久化到数据库中,并转换为受控态的实体;

 

T find(Class entityClass, Object primaryKey)

 以主键查询实体对象,entityClass是实体的类,primaryKey是主键值,如以下的代码查询Topic实体:

Topic t = em.find(Topic.class,1);
Query createQuery(String qlString)

 

Query
JPA使用javax.persistence.Query接口代表一个查询实例,Query实例由EntityManager通过指定查询语句构建。该接口拥有众多执行数据查询的接口方法:
◆Object getSingleResult():执行SELECT查询语句,并返回一个结果;

◆List getResultList() :执行SELECT查询语句,并返回多个结果;

◆Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的参数,如果查询语句使用了命令参数,则可以使用Query setParameter(String name, Object value)方法绑定命名参数;

◆Query setMaxResults(int maxResult):设置返回的最大结果数;

◆int executeUpdate():如果查询语句是新增、删除或更改的语句,通过该方法执行更新操作;

 

 

JPA的查询语言
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句 ,可以看成是Hibernate HQL的等价物。

SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = ?1

通过WHERE指定查询条件,?1表示用位置标识参数,尔后,我们可以通过Query的setParameter(1, "主题1")绑定参数。而DISTINCT表示过滤掉重复的数据。

如果需要以命名绑定绑定数据,可以改成以下的方式:

SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = :title

这时,需要通过Query的setParameter("title", "主题1")绑定参数。

 

关联查询:从One的一方关联到Many的一方

返回PollOptions对应的PollTopic对象,可以使用以下语句:

SELECT DISTINCT p FROM PollTopic p, IN(p.options) o WHERE o.optionItem LIKE ?1

这个语法和SQL以及HQL都有很大的区别,它直接实体属性连接关联的实体,这里我们通过PollTopic的options属性关联到PollOption实体上,对应的SQL语句为:

SELECT DISTINCT t0.TOPIC_ID, t0.TOPIC_TYPE, t0.TOPIC_TITLE,
t0.TOPIC_TIME, t0.TOPIC_VIEWS, t0.MULTIPLE, t0.MAX_CHOICES 

FROM T_TOPIC t0,T_POLL_OPTION t1 

WHERE (((t1.OPTION_ITEM LIKE ?) AND (t0.TOPIC_TYPE = ?))
AND (t1.TOPIC_ID = t0.TOPIC_ID))

该查询语句的另外两种等价的写法分别是:

SELECT DISTINCT p FROM PollTopic p JOIN p.options o WHERE o.optionItem LIKE ?1

和

SELECT DISTINCT p FROM PollTopic p WHERE p.options.optionItem LIKE ?1

 

关联查询:从Many的一方关联到One的一方

从Many一方关联到One一方的查询语句和前面所讲的也很相似。如我们希望查询某一个调查主题下的所示调查项,则可以编写以下的查询语句:

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框架中艰难地选择, 这对开发人员来说是个福音。

分享到:
评论

相关推荐

    spring data jpa 教程

    第三章:JpaRepository的查询 包括:解析方法名称以自动生成查询、 NamedQueries、 @Query指定查询、本地查询、命名化参数、更新查询、创建查询的顺序等内容 第四章:客户化扩展JpaRepository 包括:讲述如何在Jpa...

    JPA简明教程

    JPA原名,Java Persistence API。是SUN推出的Java持久层标准。它是“官方”标准,而Hibernate只是它的一种实现,...本文档是一本关于JPA的简明使用教程,是以示例的方式进行讲解的。希望能帮到刚开始学习JPA的朋友。

    第十三章 开发JPA应用.pdf

    MyEclipse 6 Java 开发中文教程2011.pdfMyEclipse 6 Java 开发中文教程2011.pdfMyEclipse 6 Java 开发中文教程2011.pdfMyEclipse 6 Java 开发...开发中文教程2011.pdfMyEclipse 6 Java 开发中文教程2011.pdf第十三章...

    Java进阶教程数据层全栈方案SpringData高级应用视频教程

    第三章 SpringData JPA基础 1.SpringData JPA简介 2.SpringData JPA快速入门 3.SpringData Jpa运行原理分析 第四章 SpringData JPA的多种查询方式 1.父接口方法查询 2.方法命名规则查询 3.JPQL查询 4.本地SQL查询 5....

    SpringBoot视频教程 快速上手

    第三节:SpringBoot HelloWorld实现 第二章:SpringBoot项目属性配置 第一节:项目内置属性 第二节:自定义属性 第三节:ConfigurationProperties配置 第三章:SpringBoot之MVC支持 第一节:@RequestMapping配置url...

    Java项目:大学生健康档案管理系统(java+jpa+swagger-ui+springboot+vue+mysql)

    大学生健康档案管理系统,目前演示数据中主要包括三种角色:管理员、医生、学生;其中管理员包含最高权限;可对体检表,健康文档,体检数据图标展示等进行管理,以及权限管理,指定不同科室医生进行不同的操作。此...

    刘长炯 《 MyEclipse 6 Java 开发中文教程 》1 (分三部分:1,2与源码)

    刘长炯 写的 《MyEclipse 6 Java 开发中文教程》, 详细讲解了用myeclipse工具开发java,主要章节包括 包括jdbc,spring,hibernate,struts1,struts2,以及ssh,jpa,jsf,ejb,web service,uml,swing等等一系列...

    刘长炯 《 MyEclipse 6 Java 开发中文教程 》2 (分三部分:1,2与源码)

    刘长炯 写的 《MyEclipse 6 Java 开发中文教程》, 详细讲解了用myeclipse工具开发java,主要章节包括 包括jdbc,spring,hibernate,struts1,struts2,以及ssh,jpa,jsf,ejb,web service,uml,swing等等一系列...

    3积分下载最新尚硅谷全套21套视频打包包括SpringCloud和SpringBoot等等

    七、尚硅谷JPA视频教程 八、尚硅谷SpringData视频 九、尚硅谷SSSP整合&分页视频 十、尚硅谷Redis视频 十一、 尚硅谷Maven视频 十二、 尚硅谷Shiro视频 十三、 尚硅谷MySQL高级视频 十四、 尚硅谷MyBatis 视频...

    SpringBootLearning_forezp.tar.gz

    SpringBoot非官方教程 | 第四篇:SpringBoot 整合JPA SpringBoot非官方教程 | 第五篇:springboot整合 beatlsql SpringBoot非官方教程 | 第六篇:springboot整合mybatis SpringBoot非官方教程 | 第七篇:...

    MyEclipse6 Java开发中文教程_全部18章

    第十三章 开发JPA 应用 第十四章 开发JSF 应用 第十四章 开发XFire Web Service 应用 第十五章 开发XFire Web Service 应用 第十六章 开发EJB 应用 第十七章 MyEclipse UML 建模 第十八章 图形界面开发-AWT,Swing...

    MyEclipse 6 Java 开发中文教程.rar

    MyEclipse 6 Java 开发中文教程.pdf 第十八章 图形界面开发--AWT,Swing,SWT.pdf 第十二章 开发Struts 2+Spring应用.pdf 第十六章 开发 EJB 应用.pdf 第十七章 MyEclipse UML 建模.pdf 第十三章 开发JPA应用.pdf ...

    刘长炯 《 MyEclipse 6 Java 开发中文教程 》3 配套源代码 (分三部分:1,2与源码)

    刘长炯 写的 《MyEclipse 6 Java 开发中文教程》, 详细讲解了用myeclipse工具开发java,主要章节包括 包括jdbc,spring,hibernate,struts1,struts2,以及ssh,jpa,jsf,ejb,web service,uml,swing等等一系列...

    MyEclipse_6开发中文教程

    第一章 安装配置开发环境 15 第二章 开发第一个Java...第十二章 开发JPA应用 252 第十三章 开发JSF应用 253 第十四章 开发XFire Web Service应用 255 第十五章 开发EJB 应用 258 第十六章 MyEclipse UML 建模 260

    myeclipse java开发中文教程

    MyEclipse 6 Java 开发中文教程(1-10章).pdf 第十一章 开发Spring+Struts+Hibernate应用.pdf ...第十三章 开发JPA应用.pdf 第十四章 开发JSF应用.pdf 第十五章 开发XFire Web Service应用.pdf ...

    MyEclipse.6.Java.开发中文教程(1-10章).pdf 有详细的目录(书签)

    MyEclipse 6 工具的同时,也结合从事培训的经验制作视频教程完整阐述开发过程,并配以 完整清晰基于实际项目的源代码和相关软件包,确保初学者能够完整实践书中内容,快速入 门。 本电子免费版(十章内容)文档...

Global site tag (gtag.js) - Google Analytics