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框架中艰难地选择, 这对开发人员来说是个福音。
分享到:
相关推荐
第三章:JpaRepository 的查询 Spring Data JPA 允许开发者通过约定的方法名规则来自动生成查询语句,这样可以无需编写传统的 SQL 或 JPQL 查询语句。开发者只需要按照一定规则定义方法名,框架就会自动解析该方法名...
虽然 JPA 提供了一个强大的 ORM 框架标准,但实际的实现通常由像 Hibernate 这样的第三方库完成。 Spring-data-jpa 的目标是利用 Spring 的强大功能来进一步简化 JPA 的使用。它不仅提供了简单的 CRUD 操作,还支持...
本教程集合了三本PDF电子书,旨在帮助学习者全面掌握JPA的使用。 ### 第一部分:JPA基础 《JPA_Basic.pdf》这本书可能涵盖了以下核心概念: 1. **ORM概述**:解释了ORM技术如何将Java对象与数据库表进行映射,...
### JPA入门实战教程知识点详解 #### 一、JPA简介与重要性 - **JPA定义**: JPA(Java Persistence API)是一种为Java应用程序提供持久化能力的标准接口,允许开发者将Java对象映射到关系型数据库中的表,从而简化...
### JPA2.0 高级教程知识点概览 #### 一、JPA2.0简介与特性 **Java Persistence API (JPA)** 是一种用于处理数据库操作的标准接口,为Java开发人员提供了一种对象关系映射(ORM)机制。JPA2.0作为JPA的一个重大...
### MyEclipse JPA 教程知识点详述 #### 一、引言 - **JPA简介**:Java Persistence API (JPA) 是一种用于管理关系型数据库的对象关系映射 (ORM) 规范,类似于 Hibernate。JPA 成为了 Java EE 5 规范的一部分,它...
### JPA教程:Java Persistence API详解 #### 一、引言 Java Persistence API (JPA) 是一种用于处理关系数据库的标准 Java 规范,它提供了一种对象关系映射(ORM)方法来管理 Java 应用程序中的持久化数据。JPA 的...
### 尚硅谷 JPA 教程知识点概览 #### 一、JPA 概述 - **定义**:Java Persistence API (JPA) 是 Java 平台标准的一部分,旨在为 Java 应用程序提供对象持久化的功能。它是一种 ORM (Object-Relational Mapping) ...
本教程将深入探讨Spring Data JPA的常见用法,帮助开发者快速上手并高效地进行数据库操作。 一、Spring Data JPA概述 1.1 Spring Data JPA简介 Spring Data JPA是Spring Data项目的一部分,它构建在JPA之上,提供...
JPA提供了三种继承策略: - **单表继承 (Single Table Inheritance)**:所有子类数据存储在同一张表中,使用`@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`。 - **联合继承 (Joined Table Inheritance)**...
### JPA简明教程 #### 一、JPA概述 JPA(Java Persistence API)作为Sun Microsystems在Java领域内提出的一项重要技术规范,其主要功能在于提供一套对象关系映射(Object-Relational Mapping, ORM)机制,使得开发...
**Java Persistence API (JPA)** ...综上所述,JPA学习教程会涵盖这些主题,帮助你深入理解如何使用JPA来简化数据库操作,提升开发效率。通过实践这些知识点,你可以更好地掌握面向对象编程与关系型数据库结合的技巧。
### JPA注解教程 #### 一、JPA与实体持久化 Java Persistence API (JPA) 是一种用于管理关系型数据库中数据的标准规范。它允许开发者以面向对象的方式操作数据库,无需直接编写SQL语句。JPA的核心是实体管理和查询...
添加以下三行配置: ```xml <prop key="hibernate.current_session_context_class">jta <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction....
### JPA中文教程详解 #### 1. JPA概述与背景 JPA,全称Java Persistence API,是在Java EE 5.0平台下定义的一种对象关系映射(ORM)规范,旨在解决Java应用程序中对象持久化的问题。它汲取了EJB规范早期版本的教训...
SSH+JPA基础环境搭建教程 SSH框架,全称为Struts2、Spring和Hibernate的集成,是Java Web开发中常用的一套技术栈。本环境基于SSH,并引入了JPA(Java Persistence API)作为数据持久层的解决方案,同时配合MySQL...