浅谈Hibernate与Jpa的区别与联系

在讨论Hibernate与Jpa的关系是,首先要明确Jpa的用途。JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸收了目前Java持久化技术的优势,旨在规范、简化Java对象的持久化工做。使用JPA持久化对象,并非依赖于某一个ORM框架。与Jpa相关的就是这个ORM技术,ORM 是Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心。ORM是对JDBC的封装,从而解决了JDBC的各类存在问题:java

a) 繁琐的代码问题
用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。ORM则创建了Java对象与数据库对象之间的影射关系,程序员不须要编写复杂的SQL语句,直接操做Java对象便可,从而大大下降了代码量,也使程序员更加专一于业务逻辑的实现。程序员

b) 数据库对象链接问题
关系数据对象之间,存在各类关系,包括1对一、1对多、多对一、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分当心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。
ORM创建Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系建立Java对象的关系,而且提供了维持这些关系完整、有效的机制。数据库

c) 系统架构问题
JDBC属于数据访问层,可是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、建立了什么索引等等与后台数据库相关的详细信息。
使用ORM技术,能够将数据库层彻底隐蔽,呈献给程序员的只有Java的对象,程序员只须要根据业务逻辑的须要调用Java对象的Getter和 Setter方法,便可实现对后台数据库的操做,程序员没必要知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。编程

d) 性能问题
采用JDBC编程,在不少时候存在效率低下的问题。架构


pstmt =conn.prepareStatement("insert into user_info values(?,?)");
       for (int i=0; i<1000; i++) {
          pstmt.setInt(1,i);
          pstmt.setString(2,"User"+i.toString());
          pstmt.executeUpdate();
       }app


以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。
采用ORM技术,ORM框架将根据具体数据库操做须要,会自动延迟向后台数据库发送SQL请求,ORM也能够根据实际状况,将数据库访问操做合成,尽可能减小没必要要的数据库操做请求。
知道Jpa是一种规范,而Hibernate是它的一种实现。除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,因此使用Jpa的一个好处是,能够更换实现而没必要改动太多代码。
在play中定义Model时,使用的是jpa的annotations,好比javax.persistence.Entity, Table, Column, OneToMany等等。但它们提供的功能基础,有时候想定义的更细一些,不免会用到Hibernate自己的annotation。我当时想,jpa这 么弱还要用它干什么,为何不直接使用hibernate的?反正我又不会换成别的实现。由于我很快决定再也不使用hibernate,这个问题就一直放下了。直到我如今在新公司,作项目要用到Hibernate。
我想抛开jpa,直接使用hibernate的注解来定义Model,很快发现了几个问题:
jpa中有Entity, Table,hibernate中也有,可是内容不一样;
jpa中有Column,OneToMany等,Hibernate中没有,也没有替代品;
我原觉得hibernate对jpa的支持,是另提供了一套专用于jpa的注解,但如今看起来彷佛不是。一些重要的注解如Column, OneToMany等,hibernate没有提供,这说明jpa的注解已是hibernate的核心,hibernate只提供了一些补充,而不是两 套注解。要是这样,hibernate对jpa的支持还真够足量,咱们要使用hibernate注解就一定要使用jpa。
 框架

相关文章
相关标签/搜索