JPA入门(一)

JPA全称java Persistence API.是java对象持久化的API.是javaEE5.0平台的标准ORM规范,使得应用程序以统一方式访问持久层,主要通 过JDK5.0以上的注解和XML描述对象,将运行期的实体对象持久化到数据库中.

资料:http://www.cnblogs.com/holbrook/archive/2012/12/30/2839842.html#sec-5-3

一.JPA优势

  • 标准化: 提供相同的访问API,这保证了基于JPA开放的企业应用能够经过少量的修改就能够在不同的JPA框架下运行.
  • 对容器级特性的支持:JPA框架中支持大数据集,事务,并发等容器级事务,使得JPA超越了简单持久化框架的局限.
  • 简单易用,集成方便:JPA主要目的之一就是提供更加简单的编程模型,在JPA框架下创建实体和创建Java类一样的简单,没有任何的约束和限制,只需要使用javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多的特别的规则和设计模式的要求,JPA基于非侵入式原则设计,因此可以很容易和其他框架或容器集成.
  • 可媲美JDBC的查询能力:JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改,JOIN,GROUP BY HAVING等通常只有SQL才能够提供的高级查询特性,甚至支持子查询.
  • 支持面向对象的高级特性: JPA中能够支持面向对象的高级特性,如类之间的继承,多态和类之间的复杂关系,最大限度的使用面向对象的模型.

二.JPA供应商


 Hibenate : JPA是需要Provider来实现其功能的.Hibernate就是JPA Provider中很强的一个.从功能上说,JPA现在就是Hibernate功能的一个子集,Hibernate从hibernate3.2开始就兼容JPA.

TopLink ,OpenJPA,Spring2.0.1中正式提供对JPA的支持等.

 

三.JPA技术

主要三个方面:

  1. ORM映射元数据 : JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中.
  2. JPA的API :  用来操作实体对象,执行CRUD操作.
  3. 查询语言 : 通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合.

四.JPA入门

创建JPA步骤:

  1. 创建persistence.xml  :  在这个文件中配置持久化单元(类似hibernate的hibernate.cfg.xml)文件,指定跟哪个数据库进行交互,配置数据库信息,需要指定JPA使用哪个持久化框架(因为它本身没有持久化能力)
  2. 创建实体类   :  使用annotation来描述实体类跟数据库表之间的一一映射关系.
  3. 创建EntityManagerFactory  :  类似hibernate的sessionFactory.
  4. 创建EntityManager  :  类似hibernate的Session.
  5. 对象持久化操作  :  先开启事务,使用JPA API完成数据的CRUD,在事务提交等.

    五.JPA的执行过程


     

六.JPA的persistence.xml

一个持久化单元可以创建一个EntityManagerFactory.

 

<?xml version="1.0" encoding="UTF-8"?>  
  
<persistence version="1.0"  
xmlns:persistence="http://java.sun.com/xml/ns/persistence"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd ">  
  
<!--    
     Name属性用于定义持久化单元的名字 (name必选,空值也合法);   
     transaction-type 指定事务类型(可选)    
-->  
<persistence-unit name="unitName" transaction-type="JTA">  
  
   <!-- 描述信息.(可选) -->  
   <description> </description>  
  
   <!-- javax.persistence.PersistenceProvider接口的一个实现类(可选) -->  
   <provider>   </provider>  
  
   <!-- Jta-data-source和 non-jta-data-source用于分别指定持久化提供商使用的JTA和/或non-JTA数据源的全局JNDI名称(可选) -->  
   <jta-data-source>java:/MySqlDS</jta-data-source>  
   <non-jta-data-source> </non-jta-data-source>  
  
   <!-- 声明orm.xml所在位置.(可选) -->  
   <mapping-file>product.xml</mapping-file>  
  
   <!-- 以包含persistence.xml的jar文件为基准的相对路径,添加额外的jar文件.(可选) -->  
   <jar-file>../lib/model.jar</jar-file>  
  
   <!-- 显式列出实体类,在Java SE 环境中应该显式列出.(可选) -->  
   <class>com.domain.User</class>  
   <class>com.domain.Product</class>  
  
   <!-- 声明是否扫描jar文件中标注了@Enity类加入到上下文.若不扫描,则如下:(可选) -->  
   <exclude-unlisted-classes/>  
  
   <!--   厂商专有属性(可选)   -->  
   <properties>  
    <!-- hibernate.hbm2ddl.auto= create-drop / create / update -->  
    <property name="hibernate.hbm2ddl.auto" value="update" />  
    <property name="hibernate.show_sql" value="true" />  
   </properties>  
  
</persistence-unit>  
  
</persistence>

 

 

七.JPA实体的基本元数据(注解)




 

八.JPA实体状态

<!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]-->



 


 

九.JPA的实体管理器
实体管理器(EntityManager)主要负责对JPA实体进行管理。JPA通过不同的实体管理器,可以J2ee环境、J2se环境独立运行。在两种不同的环境中,获取实体管理器是有区别的。因此实体管理器有如下两种。


1  应用程序托管的实体管理器
应用托管的EntityManager对象,程序员需要手动地控制它的释放和连接、手动地控制事务等。但这种获得应用托管的EntityManager对象的方式,不仅可以在EJB容器中应用,也可以使JPA脱离EJB容器,而与任何的Java 环境集成,比如说Web容器、J2SE环境等。所以从某种角度上来说,这种方式是JPA能够独立于EJB环境运行的基础。


l    在J2SE环境中获取EntityManager

EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAPOCPU");
EntityManager em = emf.createEntityManager();
em.close();

 
注:JPAPOCPU为persistence.xml的persistence-unit name。使用完EntityManager要手动关闭。



l    在web环境中获取EntityManager

@PersistenceUnit(unitName=" JPAPOCPU ")
   private EntityManagerFactory emf;
 EntityManager em = emf.createEntityManager();

 
注:通过注解的方式在EJB sessionbean中得到EntityManagerFactory,然后从实体工厂中得到EntityManager。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值