您的位置:首页 > 其它

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

2015-07-22 16:17 288 查看
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。

此处介绍第三种:

[java] view
plaincopy





@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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: