持久化API(JPA)系列(二)实体入门

来源:互联网 发布:火爆网络ann 编辑:程序博客网 时间:2024/04/25 23:19

上一篇文中我们讲述了《持久化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实现有如下几种:

HibernateJPA实现:主要由Hibernate开源框架提供,也是JBoss应用服务器内置的JPA实现

TopLinkJPA实现:主要由TopLink提供,也是GlassFish应用服务器内置的JPA实现

OpenJPA实现:由Apache开源组织提供,可以在任何JavaSe项目中使用。

不同的JPA实现通过persistence.xml文件的配置信息来区分。

无论是那种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();      } 

(四)使用orm.xml管理O/R映射

管理实体和底层数据表之间的对应关系不仅可以Annotation,还可使用XML配置文件

 JPA中使用orm.xml

Hibernate中使用*.hbm.xml

当然使用Annotation来管理更加简单、易用,所以推荐使用Annotation。


总结:

通过上述入门级的JPA实例,您会发现JPA执行持久化操作和使用Hibernate执行持久化操作也有较大的相似性。而且通过Annotation类管理更加简单、易用。



2 0
原创粉丝点击