标签:
上一篇文中我们讲述了《持久化API(JPA)系列(一)实体简介》
JPA实现的作用就是:把对实体的操作,转换成对数据库的操作。这样应用程序就能以面向对象的方式操作实体,而JPA实现则负责转换成对应的SQL(结构化查询语言)操作。
JPA只是一种规范!并不是任何具体的ORM框架!当在程序中使用JPA进行持久化时,底层一定需要具体的ORM框架作为实现。
本文核心:
接下来我们先介绍一个入门级的JPA实例,通过这个实例读者可以感受到JPA的简单、易用性。
您会发现JPA执行持久化操作和使用Hibernate执行持久化操作也有较大的相似性。
(一)开发实体
实体类就是一个普通的POJO类,只是为这个POJO类添加一些额外的Annotation即可。
Annotation定义了POJO类和底层数据表之间的映射关系。
JPA的实体与Hibernate中的持久化对象如出一辙,下面是一些对比:
1、如何管理POJO和数据表之间的对应关系:
Hibernate早期采用XML映射文件
JPA实体则采用Annotation
2、在进行实际的数据库访问之前,如何管理数据库连接、连接池信息/如何管理持久化单元信息:
Hibernate需要使用hibernate.properties或hibernate.cfg.xml
JPA则需要使用persisitence.xml
3、相似之处,应用程序通过实体映射底层数据表,但实体本身并没有任何访问数据库的能力。
Hibernate采用Session来保存、删除实体
JPA则采用EntityManager;且会将这种面向对象的操作转化为底层的SQL操作。
正如上文所说,JPA本身只是一种规范,它必须依赖于一种具体的实现才能完成实际的持久化操作。
不同的JPA实现通过persistence.xml文件的配置信息来区分。HibernateJPA实现:主要由Hibernate开源框架提供,也是JBoss应用服务器内置的JPA实现
TopLinkJPA实现:主要由TopLink提供,也是GlassFish应用服务器内置的JPA实现
OpenJPA实现:由Apache开源组织提供,可以在任何JavaSe项目中使用。
无论是那种JPA实现,应用程序所需要的persistence.xml文件总是应该放在类加载路径的META-INF路径下。
(二)HibernateJPA实现
Hibernate官网:点击这里。其中JPA Provider就是Hibernate框架提供的IPA实现。
persistence.xml文件管理持久化单元信息的Demo,已经如何使用EntityManager,请参见《深入浅出JPA--实例》
注意:
1、为了在JavaSe应用中使用Hibernate JPA实现,必须先下载和安装Hibernate JPA实现。
2、由于JPA底层依然是基于JDBC的,因此应用程序中使用JPA执行持久化时一定少不了JDBC驱动,本例采用MySQL数据库,因此还需要将MySQL数据库驱动添加到应用的类加载路径中。
3、若hibernate.cfg.xml文件已经配置管理数据库连接信息,则只需要在persistence.xml文件中指定其位置即可。
4、Hibernate底层会利用不同的数据库特性生成相应的SQL语句进行优化,设置数据库方言就是告诉MySQL所连接的数据库类型。
(三)EntityManager相关知识
JPA的核心API就是EntityManager,它负责管理JPA持久化上下文中的所有实体,它负责跟踪所有的实体的保存、更新、修改情况,并根据指定的flush模式将这些修改保存到数据库中。
从功能上看,EntityManager类似Hibernate框架中的Session,负责完成实体操作和数据库操作之间的转换:
当EntityManager保存一个实体,底层会生成一条insert语句
当EntityManager修改一个实体,底层会生成一条update语句
当EntityManager删除一个实体,底层会生成一条delete语句
在应用程序中使用EntityManager,大致分为3中情况:
1、在EJB中使用EntityManager:直接使用依赖注入来管理
2、在Servlet、JSF的托管Bean中使用EntityManager:不能直接使用依赖注入来管理。因为多个请求线程可能共享同一个Servlet或JSF的托管Bean,而EntityManager并没有被设计成线程安全的额,因此可能导致线程安全问题。解决办法:
①通过JNDI获取EntityManager对象
②使用依赖注入管理EntityManagerFactory(线程安全),再通过EntityManagerFactory来获取EntityManager对象。
3、JavaSe中使用EntityManager,需要通过应用程序暗示的创建EntityManager。
此处介绍第三种:
@Test public void Testremove() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); // 开始事务 Person person = em.find(Person.class, 1); em.remove(person); // 删除实体 em.getTransaction().commit(); // 提交事务 em.close(); factory.close(); }
管理实体和底层数据表之间的对应关系不仅可以Annotation,还可使用XML配置文件
JPA中使用orm.xml
Hibernate中使用*.hbm.xml
当然使用Annotation来管理更加简单、易用,所以推荐使用Annotation。
通过上述入门级的JPA实例,您会发现JPA执行持久化操作和使用Hibernate执行持久化操作也有较大的相似性。而且通过Annotation类管理更加简单、易用。
标签:
原文地址:http://blog.csdn.net/zhaolijing2012/article/details/43983539