SpringData Jpa、Hibernate、Jpa 三者之间的关系

参考:

http://blog.csdn.net/u014421556/article/details/52635000

http://blog.csdn.net/anxpp/article/details/51415698

JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现,JBoss应用服务器底层就以Hibernate作为JPA的实现。

既然JPA作为一种规范——也就说JPA规范中提供的只是一些接口,显然接口不能直接拿来使用。虽然应用程序可以面向接口编程,但JPA底层一定需要某种JPA实现,否则JPA依然无法使用。

从笔者的视角来看,Sun之所以提出JPA规范,其目的是以官方的身份来统一各种ORM框架的规范,包括著名的Hibernate、TopLink等。不过JPA规范给开发者带来了福音:开发者面向JPA规范的接口,但底层的JPA实现可以任意切换:觉得Hibernate好的,可以选择Hibernate JPA实现;觉得TopLink好的,可以选择TopLink JPA实现……这样开发者可以避免为使用Hibernate学习一套ORM框架,为使用TopLink又要再学习一套ORM框架。

下图是JPA和Hibernate、TopLink等ORM框架之间的关系:



 

 JPA规范与ORM框架之间的关系

JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC可以驱动JDBC驱动吗?

那么Spring Data JPA与JPA规范的关系是怎样的呢?

实现应用程序的数据访问层已经很麻烦了好一阵子。太多的样板代码必须被写入。Domain classes,并没有被设计成面向一个真正的对象或领域驱动的方式。

使用spring data jpa能够使丰富的Domain classes的持久性开发变得轻松很多,即使样板代码来实现存储库量特别还是相当高的。所以Spring data jpa的目标是简化关于各种持久存储数据访问层而努力。

备注:Domain classes 指的是POJO类,例如数据库中有一张表:Student,那么我们会在程序中定义与之对应的Student.java,而这个Student.java就是属于Domain classes。

长话短说,Spring Data JPA 是在JPA规范的基础下提供了Repository层的实现,但是使用那一款ORM需要你自己去决定。

我的理解是:虽然ORM框架都实现了JPA规范,但是在不同ORM框架之间切换是需要编写的代码有一些差异,而通过使用Spring Data Jpa能够方便大家在不同的ORM框架中间进行切换而不要更改代码。并且Spring Data Jpa对Repository层封装的很好,可以省去不少的麻烦。



 

一个例子

 如果一张表user有三个字段,id、name和age,要查找指定姓氏在某年龄以上的user,在传统的Spring+Hibernate中,dao层我们是这样写的:

UserDao:

    public interface UserDao{
List<User> findByNameLikeAndAgeGreaterThan(String firstName,Integer age);
}

UserDaoImpl:

public class UserDaoImpl implements UserDao{
@Override
public List<User> findByFirstNameAndAge(String firstName, Integer age) {
//具体hql查找:"from User where name like '%'"+firstName + "and age > " + age;
return hibernateTemplateMysql.execute(new HibernateCallback() {
@Override
public Object doInHibernate(Session session) throws HibernateException {
String hql = "from User where name like '?' and age > ?";
Query query = session.createQuery(hql);
query.setParameter(0, firstName+"");
query.setParameter(1, age);
return query.uniqueResult();
}
});
}
}

 然而,如果我们用Spring Data JPA呢:

UserDao:

public interface UserDao extends JpaRepository<User, Serializable>{
List<User> findByNameLikeAndAgeGreaterThan(String firstName,Integer age);
}

 对,就这样,已经没有了,连实现都不需要写的!service直接调用userDao.findByNameLikeAndAgeGreaterThan(firstName+"%",age)。

即可。

猜你喜欢

转载自huangqiqing123.iteye.com/blog/2413183