`
longgangbai
  • 浏览: 7330974 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JPA规范的主要内容

阅读更多

Entity Identity 实体标识
一般采用单一值做为entity identity
采用compsite primary key时,必须单独建立一个表示主键的类-primary key class主键类。这样在实体上compsite primary key就可以用一个属性(primary key class类型)表示
持久化框架内部很多地方使用entity identity进行处理,因此primary key class要正确实现equals、hashCode方法
另外应用层需要注意,对persistence context中受管理的对象,不要修改主键值,否则持久化框架无法承诺带来的影响,因为persistence context只能基于entity identity标识实体身份

Accessor of Persistent Fields and Properties 持久化值域和属性的访问器
Persistent state(即需要持久化的fields或properties)的存取分2种类型:field-based和property-based
field-based时持久化框架直接存取instance variables,property-based时则通过getter、setter方法存取
使用property-based时,在setter、getter方法中可能包含业务逻辑,对于应用层而言,需要注意的是持久化框架从数据库加载数据,为实体属性赋值时,各属性的赋值顺序是无法承诺的,因此getter、setter中的业务逻辑需要注意这一点
另外使用property-based时如果还将属性声明为lazy-fetching,则应用层不应当访问相应的instance variable,因为持久化框架可能对setter、getter进行注入以实现lazy-fetching,直接访问instance variable可能获取不到值
对于集合类型,JPA规定必须使用java.util下面的Collection、Set、Map、List这几个接口,关于List、Set、Map、Bag的语义,参考这篇post

Persistence Context 持久化上下文

   
Persistence Context是持久化框架需要维护的一个中间容器,其中会存放受管理对象的副本,例如从数据库获取的实体对象,或者调用持久化框架保存过的对象等
主要作用有:缓存(例如NHibernate的一级缓存概念)、支持Flush操作、辅助实现实体以及属性的Dirty检查等
JPA将persistence context分为2种类型:PersistenceContextType.TRANSACTION和PersistenceContextType.EXTENDED。TRANSACTION类型(默认类型)的persistence context生命周期与transaction scope一致,例如事务开始时为生命周期的开始阶段,事务提交或回滚时生命周期结束。EXTENDED类型的生命周期基本与EntityManager一致,在EntityManager创建时开始,在EntityManager关闭时结束。实现Extended类型的persistence context时需要注意其生命周期可能跨越多个事务以及不在事务范围内的情况,伴随的是这些情况下对persistence context中实例对象生命周期以及相关操作的影响,例如version控制等

Entity Instance's Life Cycle 实例对象生命周期
实例对象的生命周期可以参考一下这篇post
实例对象的生命周期有4种状态:
New: 新创建的实例对象,没有identity值
Managed: 在持久化上下文中受管理的对象
Detached: 游离于持久化上下文之外的实例对象
Removed: 被删除的实例对象
JPA中详细定义了实例对象伴随着EntityManager的各种操作时,生命周期状态间的转换关系

JPA声明了entity instance life cycle的几个callback方法:PrePersist、PostPersist、PreRemove、PostRemove、PreUpdate、PostUpdate、PostLoad,对其语义进行了比较详细的说明

Entity Relationships 实体关系
JPA定义了one-to-one、one-to-many、many-to-one、many-to-many 4种关系

Owning side, Inverse side 关系的所有方、反向方
在关联关系的2方之中,关系的所有者一方为owning side,另一方为inverse side。关系的所有者可以这样来理解,将所有者一方的实例删除后,这个2方关系的任何信息都彻底消失。假如逻辑上表A有一个外键,引用自表B的主键(所谓逻辑上是指数据库中并没有建立这个外键关系),如果将表B中某条数据b1删除,A、B间相应实例对象的关联关系可能并不会彻底消除,因为表A中可能还存在某数据a1引用了b1的主键值,因此与B对应的实体类就不是owning side了
因此拥有外键的一方就是owning side了,这个在one-to-one的关系中比较清晰;one-to-many、many-to-one中,many的一方为owning side;many-to-many中任何一方都可以作为owning side
Owning side、inverse side将作为cascade相关操作的依据之一

JPA详细定义了默认情况下对以下一些映射的处理方式:
双向one-to-one;双向one-to-many、many-to-one;单向single-valued(单向one-to-one、many-to-one);双向many-to-many;单向multi-valued(单向one-to-many、many-to-many)

Inheritance 继承
Inheritance Mapping Strategies包括:
Single table per class hierarchy,使用一个discriminator column区别子类,优点是很好的支持多态关系、查询,缺点是子类独有的字段需要允许为null
Table per concrete entity class,缺点是不好支持多态关系,通常需要对各子类分别使用单独的SQL或者使用UNION语句
Joined subclass,与table per concrete entity class区别是,将公共属性的superclass使用一个表存储,这种策略也能较好的支持多态关系,缺点是需要多个JOIN关系
详细参考这篇post

Optimistic Locking and Concurrency 乐观锁及并发控制
JPA默认应用层将使用乐观锁机制
使用乐观锁时entity必须声明一个version属性,该字段的值由持久化框架自动维护,应用层不能修改。持久化框架可以引入其它机制实现乐观锁检查,或者实现更细粒度的乐观锁控制,JPA不做要求
JPA的乐观锁机制是基于数据行的

JPA中声明了Lock Mode,可以实现悲观锁效果,至于实现方式不作具体要求,只要确保不存在P1: dirty read、P2: non-repeatable read就行
LockModeType有READ和WRITE 2种
对于WRITE模式,在isolation level为read commited情况下数据库可以确保不会出现P1、P2两种状况
READ模式一般使用数据库的锁实现,用它实现悲观锁效果

Query Language 查询语言
类SQL的语法,但是带上了较明显的对象特征
声明了SELECT、UPDATE、DELETE 3种语句

用简单的例子浏览一下大致特性
1. 使用实体间的关联关系

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT DISTINCT o
FROM Order o JOIN o.lineItems l JOIN l.product p
WHERE p.productType = 'office_supplies'

JOIN子句不再需要ON条件部分了,因为对象之间已经定义了关联关系

2. Collection Member Declarations

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT DISTINCT o
FROM Order o, IN(o.lineItems) l
WHERE l.product.productType = 'office_supplies'

与1中的语句是等效的
FROM子句中为Order实体定义了别名o(Identification Variables);o.lineItems是集合类型的属性,IN(o.lineItems) l 的语义是:Order实例对象的lineItems中必须有符合后续条件的,l则代表lineItems中的每个对象;WHERE子句进一步声明了对l的过滤条件

JPA中把l.product这种表达式叫做path expression(An identification variable followed by the navigation operator (.) and a state-field or association-field is a path expression)
path express中每个点号后面的内容,有三种类型:persistent field、single-valued relationship field、collection-valued relationship field。如果是collection-valued relationship field则只能在特定的场景下使用
例如上面1、2例子中,如果lineItems不是集合类型,则这2个例子的语句都等效于下面的写法(lineItems属性改名为lineItem以区别于集合这个概念):
3. 

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT DISTINCT o
FROM Order o
WHERE o.lineItem.product.productType = 'office_supplies'

对path expression中的关联关系,JPA规定使用INNER JOIN操作,因此上面语句等效前面的示例1、2
但当lineItems为collection-valued relationship field时,上面写法不支持,必须采用1或2的写法
特定场景包括上面示例出来的JOIN子句、Collection Member Declarations这2种,还有Empty Collection Comparison Expressions、Collection Member Expressions中可以使用

4. Empty collection comparison expressions

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT o
FROM Order o
WHERE o.lineItems IS [NOT] EMPTY


5. Collection Member Expressions

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT o
FROM Order o
WHERE :lineItem MEMBER [OF] o.lineItems

:lineItem是一个变量,在应用中为该变量赋值一个lineItem实例对象,上面查询的语义是:找到:lineItem对象关联的Order实例对象

6. ALL and ANY Expressions

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT emp
FROM Employee emp
WHERE emp.salary > ALL (
    
SELECT m.salary
    
FROM Manager m
    
WHERE m.department = emp.department)

ALL和ANY表达式用于子查询
上面的emp.salary>ALL(...),表示emp.salary必须大于子查询中返回的所有值;如果子查询没有符合条件的记录,则emp.salary>ALL(...)这个条件为true
将上面例子中的关键字ALL改为ANY(或者是SOME)关键字,则表示emp.salary只要大于子查询中返回的部分值就符合条件;如果子查询没有符合条件的记录,则emp.salary>ANY(...)这个条件为false;如果子查询返回的结果全部都大于或等于emp.salary,则这个条件为false

7. Constructor Expressions
使用constructor expressions可以指定使用特定的构造函数返回实例对象列表,而不是object数组的列表

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT NEW com.xyz.CustomerDetail(c.name, c.country.name)
FROM customer c
WHERE c.lastname = 'Coss' AND c.firstname = 'Roxane'


8. 再来几个示例
Find all orders that have line items:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT DISTINCT o
FROM Order o, IN(o.lineItems) l

或者:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT o
FROM Order o
WHERE o.lineItems IS NOT EMPTY


Find all orders that have no line items:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY


通过上面这些例子可以看出JPA的查询语言具备较强的对象表达能力

UPDATE、DELETE语句的主要目的是提供bulk update、delete操作
JPA中也声明了一些函数,大部分为SQL标准中的一些基本函数

实现JPA规范的查询语言时,需要重点处理的一个方面是多态查询,语句中的实体类名有可能是abstract的或者supperclass,查询解析器需要能够处理这种多态查询。例如NHibernate(目前版本不知是否改成了Antlr来解析)在分析查询语句时比较简化处理,每遇到实体类都搜索是否有子类存在,如果有则会为每个子类生成一个查询语句,使用JOIN、UNION或者单独执行每个语句再将结果合并(NHibernate不支持Union Subclass),只实现了部分多态能力。要实现完全的多态能力,面对的情况以及需要处理的东西都比较复杂
其它一些细节方面的东西也非常多,例如persistence context可能缓存了一些更新操作,等待Flush时回写数据库,但为了保证查询结果的一致性,执行查询前至少需要先将persistence context中相关实体的更新缓存运用到数据库中

Metadata
详细的元数据声明规范,查阅JPA对annotation、XML descriptor的说明一节

分享到:
评论

相关推荐

    JPA 规范1.0 中文版

    #### 二、JPA 规范1.0主要内容解读 ##### 2.1 规范背景 - **JSR 220**:JPA 规范是 JSR 220(Java Specification Request)的一部分,即 Enterprise JavaBeans (EJB) 3.0 规范。 - **开发团队**:由 Sun ...

    JPA规范实现与总结

    标题:“JPA规范实现与总结” 描述:“JPA规范实现,用JPA来解决可移植问题” 本篇文章将深入探讨Java Persistence API(JPA)的规范实现及其在解决跨平台可移植性问题上的优势。JPA作为Java企业级应用中用于对象...

    jpa的主要jar文件

    总之,JPA的主要jar文件是开发基于JPA应用不可或缺的组件,它们提供了JPA规范的实现和与数据库交互的必要工具。了解和掌握这些jar文件的作用以及如何正确配置它们,对于有效地使用JPA进行数据持久化至关重要。

    JPA规范 1.0

    JPA 1.0是这个规范的第一个主要版本,它为开发者提供了一种统一的、声明式的方式来处理数据持久化,从而简化了企业级应用的开发过程。JPA的核心理念是对象关系映射(ORM),它允许开发者用面向对象的方式思考,而...

    jpa1.0中文手册

    JPA规范的主要作用是将Java对象映射到关系数据库表中,并提供了一组API来对这些对象执行CRUD(创建、读取、更新、删除)操作。JPA的目的是让开发者能够更简单地编写与数据库交互的代码,同时减少数据库操作的复杂性...

    jpa2.0 规范文档.zip

    Java persistence api, jpa 2.0最终版使用规范, 资源是压缩包, 下载后解压缩文件,然后重命名persistence-2_0-final-spec文件,添加后缀 .pdf 原始文件的类型时pdf的

    Hibernate4之JPA规范配置详解

    以上就是Hibernate4中关于JPA规范配置的详细介绍,包括了 `@Table`、`@SecondaryTable`、`@SecondaryTables`、`@UniqueConstraint`、`@Column` 和 `@JoinColumn` 等注解的主要用途和示例代码。通过对这些注解的理解...

    ssh2,JPA规范基础框架+ant打包

    在SSH2中集成JPA,可以充分利用JPA的注解规范,简化数据库操作。JPA通过注解可以在实体类上定义数据库表结构,如@Table表示实体类映射的数据库表,@Id表示主键,@GeneratedValue用于自动生成主键值等。此外,JPA还...

    JPA源文件/jpa学习

    **JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体(Entities)、实体管理器(EntityManager)、查询语言(JPQL)和 Criteria API 等核心概念。通过使用JPA,开发者可以将业务对象与数据库表进行映射...

    基于JPA规范实现hibernate依懒的jar包

    在本主题中,我们将深入探讨如何基于JPA规范来实现Hibernate依赖的jar包,以及这些jar包在Java项目中的作用。 首先,了解JPA的基本概念非常重要。JPA允许开发人员使用面向对象的编程模型来处理数据库操作,而无需...

    Java Persistence API(EJB3.0中的 JPA 规范说明)

    以及在口头或书面交流中摘录规范的部分内容,只要这些摘录不构成规范的重要组成部分。 - **合规实施的许可**:允许用户根据适用的版权或专利权利永久、非独占、不可转让、全球性地创建和/或分发符合规范的独立实现...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    TOPLink JPA提供了完整的JPA规范支持,包括实体管理、查询语言(JPQL)以及事务处理。TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,...

    Pro JPA2 精通JPA2

    本书由JPA规范的主要领导者Linda DeMichiel作序,确保了其内容的权威性和准确性。 ### JPA2的关键特性 1. **实体管理器(EntityManager)**:这是JPA的核心接口,负责所有与实体类相关的操作,如持久化、删除、...

    JPA规范注解的javax.persistence包

    JPA规范的注解主要集中在`javax.persistence`包中,这些注解用于标注实体类、属性、关系等,使得ORM(对象关系映射)过程更加便捷。 在`javax.persistence`包中,有几个核心的注解,包括但不限于: 1. `@Entity`:...

    Gemini JPA 介绍资料

    在Java开发中,持久化层通常是通过JPA(Java Persistence API)来实现的,JPA规范定义了对象-关系映射(ORM)的框架,从而使得Java对象可以被存储到关系型数据库中。 在了解Gemini JPA之前,有必要先了解一下JPA...

    jpa框架资源基于hibernate

    当与JPA结合时,Hibernate作为持久化提供者,实现了JPA规范,从而为开发者提供了标准的接口和API。 **JPA和Hibernate的关系**: - JPA是规范,定义了ORM的标准,由Java EE(现在称为Jakarta EE)维护。 - Hibernate...

    JPA注解 和hibernate 建表

    Hibernate是一个基于JPA规范的ORM(Object-Relational Mapping)框架,它提供了对数据库的访问和操作功能。Hibernate可以将Java对象转换为对应的数据库表记录,从而实现了数据的持久化。 四、Hibernate.cfg.xml文件...

Global site tag (gtag.js) - Google Analytics