温立辉
摘 要:针对Java EE编程中的JPA持久化问题,讨论了JPA的适用场景,阐述JPA规范的应用原理;在论述中详细分析了JPA持久化过程中的4种不同数据实体状态,以及不同实体状态的转化条件及相关的API操作接口;同时也分析了数据实体间的关联关系,以及不同关联关系在JPA持久化ORM技术中配置实现,最后说明了JPQL语句的原生SQL语句的区别以及其在Java EE领域的重要作用。
关键词:JPA JPQL 持久化规范 ORM
中图分类号:TP311.52 文献标识码:A 文章编号:1672-3791(2019)02(c)-0005-02
JPA即Java 持久化API(Java Persistence API),是Java EE5后提出的的一个持久化规范,此规范参照了EJB3的 Entity Bean(实体Bean)实现过程,其使用JPQL语句来对表实体进行CRUD的操作,在Java语言企业级编程存在着非常广泛的应用。
1 JPA概述
JPA作为一个持久化规范,其专门负责定义与数据存储层的交互标准,定义交互过程,其作为规范,只定义了上层接口,并不负责具体的实现过程,实际上在开发市场中,JPA有众多的实现方式,如Hibernate、TopLink、OpenJPA等持久化框架。
JPA作为一套数据持久化的规范,其思想对ORM编程继承与细化,在Java编程中由于面向对象编程思想与关系型数据库的思维差别,致使应用程序与关系数据库存在一定的交互障碍,ORM作为面向对象的应用程序与关系型数据库间的交互中介桥梁,解决了开发中编码问题,使用开发人员能用使用面向对象的思维去处理和操作关系库。
2 JPA状态表述
在JPA规范中,实体状态的变化都是通过EntityManager接口下的相关函数的被调用而触发的,一个实体从对象变成数据库表中的一条记录,一共可经历4个状态,分别是:新建状态(New)、游离状态(Detached)、受控状态(Managed)、删除状态(Removed)。
新建状态:当一个实体对象刚刚通过new创建出来,还未和其他持久化机制发生任何关联,这时这个实体的实例处于新建状态。
游离状态:当实体对象已经从持久化机制中得到唯一主键,但实例未与持久化机制发生关联关系,则此时对象处于游离状态,当通过EntityManager接口调用clear()方法,实例对象进入游离状态。
受控状态:实体对象已经从持久化机制中得到唯一主键,且已经与持久化机制发生关联关系,则对象处于受控状态,当通过EntityManager接口调用persist()方法,实例对象进入游离状态。
删除状态:如果一个实体对象满足受控的基本要求,即处于受控状态,此时将对象删除,则对象进入删除状态,当通过EntityManager接口调用remove()方法,实例对象到达删除状态。
3 JPA关系实体表述
JPA作为持久化的操作规范,其对应用程序中实体间的关系作了明确的定义,共分三大类型,分别是:一对一(one to one)、一对多(one to many)、多对多(many to many),接下来以Hibernate框架的JPA实现为载体来进行各种实体关系的分析。
一对一:就是两个实体间,一方实体的任一实例只能对应于另一方实体唯一的实例。在日常生活中,例如个人与身份证号码的关系,每个人都有唯一的一个身份证号码,同时每个身份证号码都只能属于某一个人。
具体实现需要在每个实体中引入对方实体作为本类的一个全局属性。如需要在用户(Person)类中引入对方:private Idcard idcard;同时需要在身份证(Idcard)类引对方:private Person person。还要在XML文件做相应的设置,在Person实体的映射文件中加入:
一对多:就是两个实体之间,一方实体的一个实例可以在另一实体中找到若干个与之对应的实例,但另一方实体的一个实例却只能对应对方实体的一个实例。例如,在一个家庭中一对父母親可以生育多个子女,但每个子女却都只能有一对父母亲。
在具体实现中,需要在代表一方的父母实体 (Father) 类中引入一个Set集合属性:private Set sons = new HashSet(0),作为与多方的关联属性;同时需要在代表多方的子女实体 (Son) 类中引入一个Father类型属性:private Father father。最后需要在Father实体映射文件中配置: