一、什么是JPA
对象关系映射ORM(Object-Relation Mapping)是用来将对象和对象之间的关系对应到数据库中表与表之间的关系的一种模式。ORM框架能够将Java对象映射到关系数据库,能够直接持久化复杂的Java对象。ORM框架的出现,使开发者从数据库编程中解脱出来,把更多的精力放在了业务模型与业务逻辑上。目前比较流行的ORM框架有Hibernate、iBatis、TopLink等。在JPA规范之前,由于没有官方的标准,使得各ORM框架之间的API差别很大,使用了某种ORM框架的系统会严重受制于该ORM的标准。
二、JPA的宗旨是为POJO提供持久化标准规范。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。其技术主要包括:
1、ORM映射元数据 JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
2、JPA 的API 用来操作实体对象,执行CRUD(它是Create创建、Read读取、Update更新和Delete删除的缩写)操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
3、查询语言这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序与SQL语句的紧密耦合。
三、JPA与Hibernate的关系:
1、JPA本质上是一种ORM规范,并未提供ORM实现,其具体实现由其他厂商来提供。程序员若使用JPA,仍然需要选择JPA的实现框架。
Hibernate是一个面向Java环境的对象关系数据库映射工具,即ORM工具。它对JDBC API进行了封装,负责Java对象的持久化,在分层的软件架构中它位于持久化层,封装了所有数据访问细节,使业务逻辑层可以专注于实现业务逻辑。Hibernate不仅仅管理Java类到数据库表的映射,还提供了数据查询和获得数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。
2、Hibernate 3.2以后的版本开始支持JPA,其中,涉及JPA的子项目有三个,它们分别是:
四、实体与实体管理器
1、实体(Entity)
(1)、一个实体的定义符合JavaBean的规范,因此常常称为实体Bean。实体Bean的每个属性都定义为私有的,并且有对应的Setter和Getter方法。JPA将实体映射到数据库有两种方法,一种是基于xml文件,一种是基于标注。
(2)、采用标注方法映射的实体Bean,在类的定义中还包含了映射信息,这些映射信息都是通过标注表示的。下面是图书分类的实体Bean。
@Entity
@Table(name = "bs_category")
public class BsCategory implements Serializable {
}
2、实体管理器(EntityManager)
3、如何获取EntityManager
(1)、实体管理器要通过实体管理器工厂建立。但是,当使用容器托管的实体管理器(在Java EE环境中)时,应用不和实体管理器工厂交互
。实体管理器直接通过依赖注入或JNDI获得,容器负责与实体管理器工厂交互。
(2)、注入实体管理器 可以用@PersitenceContext标注来注入EntityManager,其属性 type指明持久化上下文的作用范围,默认是
TARNSACTION。若选择EXTENDED(扩展的方式),可使得多次调用使用同样的上下文,它的意义在于对有状态的Bean可以跨事务操作实体;
unitName(可选)用于指定一个持久性单元。
(3)、当使用应用托管的实体管理器时,应用必须使用实体管理器工厂来管理实体管理器和持久化上下文的生命周期。EntityManagerFactory
接口供应用来创建应用管理的实体管理器。EntityManagerFactory的方法都是线程安全的。注入实体管理工厂 在Java EE容器内,可以用
@PersistenceUnit标注注入或者通过JNDI查找获得EntityManagerFactory,其unitName属性(可选)用于指明使用哪个持久性单元。
五、JPA开发步骤:
使用JPA进行数据操作,基本的步骤如下:
(1)配置服务器数据源。
(2)建立持久性单元。
(3)建立实体类。
(4)建立实体管理器。
(5)操作实体。
(6)关闭实体管理器。
1. 持久化实体(创建实体)
em.persist(bsCustomer);//em为实体管理器对象,customer为客户实体对象
2. 修改实体
em.merge(bsCustomer);
3.删除实体
em.remove(bsCustomer);
4. 根据主键查询实体
BsCustomer bsCustomer = em.find(BsCustomer.class, custId);
5.刷新实体
6.刷新实体到数据库
7.设置刷新模式
8.分离实体
9.执行复杂查询