JPA(Java Persistence API,Java持久化API)
JPA是EJB3 Entity Bean,是一套从EJB3.0核心标准中分离出来的独立的标准文档
一、JPA的由来
对象关系映射ORM(Object-Relation Mapping)是用来将对象与对象之间的关系对应到数据库中表与表之间的关系的一种模式。
ORM框架的出现,使开发者从数据库编程中解脱出来,把更多的精力放在了业务模型和业务逻辑上,因为ORM框架能够将Java对象映射到关系数据库、直接持久化复杂的Java对象。
目前比较流行的ORM框架有Hibernate、iBatis、TopLink等,由于官方没有一定的标准,使得各ORM框架之间的API差别很大,导致使用某种ORM框架的系统会眼中受制于该ORM的标准,故有了JPA规范。
【总结】:Sun引入新的JPA ORM规范处于两个原因:
《1》简化现有Java EE 和Java SE应用的对象持久化的开发工作,和实体Bean相比,不需要配置文件,并且不依赖J2EE容器,是Java中的通用API;
《2》Sun希望整合对ORM技术,统一各种ORM框架的规范,实现天下归一。
二、为什么要使用JPA
JPA代码精简易读,开发工作量小,可以将精力集中在业务逻辑的处理上,并且便于维护,其维护与学习成本较低。
三、JPA的缺点
《1》 由于非常新,JPA规范可能还需要经过重要发展才会变得稳定;
《2》 JPA只是一个规范而不是产品,需要供应商提供一个实施,才能获取这些基于标准API的优势;
《3》 JPA是Hibernate、TopLink、JDO等ORM框架的真子集,只提供其中最好的功能,如果应用程序中需要的功能在JPA规范中没有,则需要使用供应商特有的API,这样移植起来比较麻烦。
四、JPA主要技术
JPA的宗旨是为POJO(Plain Old Java Object-简单的Java对象)提供持久化标准规范。目前提供了JPA实现的有Hibernate 3.2、TopLink10.1.3以及OpenJPA。其主要技术包括:
《1》ORM映射元数据:JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
《2》JPA的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,使开发者从繁琐的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的子项目有三个,分别是:
Hibernate Core Hibernate 框架的核心实现;
Hibernate Annotations 支持JDK 5.0的注释;
Hibernate EntityManager 支持JPA的实现。
《3》 JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。
《4》JPA是hibernate的一个抽象或者可以理解为借口,如果从功能上说,JPA就是Hibernate功能上的一个子集。
六、具有ORM元数据的领域对象称为实体(Entity),按JPA的规范,实体具备以下条件:
《1》 必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;
《2》 必须具有一个不带参的构造函数,其中不仅类不能声明为final,方法和需要持久化的属性也不能声明为final;
《3》 如果游离状的实体对象需要以值的方式进行传递(如通过Session bean的远程业务接口传递),则必须实现Serializable接口;
《4》 需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。