5.5.1 使用JPA模板
与Spring对其他存留框架的支持相一致,Spring-JPA的核心元素是个模板类:JpaTemplate,它包裹了一个JPA EntityManager。下面的XML用于在Spring里配置一个JPA模板:
![]() |
JpaTemplate的entityManagerFactory属性必须装配为JPA的javax.persistence. EntityManagerFacotry接口的一个实现,如图5.10所示。JpaTemplate使用这个EntityManagerFactory生成所需的EntityManager。5.5.2小节里将介绍entityManagerFactory bean来自何处。
![]() |
图5.10 Spring的JpaTemplate实现模块化的 JPA数据访问,确保根据需要打开和关闭 EntityManagers、处理异常、引用Spring事 务里的EntityManager。 |
像Spring的其他存留模板一样,JpaTemplate也具有很多数据访问方法,它们都是由JPA EntityManager提供的。但与普通JPA不同的是,JpaTemplate确保EntityManager根据需要打开或关闭、在事务里使用EntityManager并处理异常。
为了编写基于JpaTemplate的DAO,我们要为DAO添加JpaTemplate属性,并且为注入提供一个设置器。下面的JpaRantDao代码片断展示了JpaTemplate属性:
![]() |
在Spring里配置JpaRantDao时,我们只需要把JpaTemplate装配到jpaTemplate属性:
![]() |
在把JpaTemplate注入到DAO之后,我们就可以使用这个模板来访问存留的对象。
通过JPA模板访问数据
JpaTemplate提供了很多与JPA的EntityManager一样的存留方法,因此对于已经熟悉JPA的程序员来说,使用JpaTemplate是很容易上手的。举例来说,下面的saveMotorist()方法使用JpaTemplate的persist()方法把Motorist对象保存到数据库:
![]() |
除了与EntityManager相同的标准方法集之外,JpaTemplate还提供了其他一些便于进行数据访问的方法。举例来说,下面的getRantsForDay()方法使用JPA EntityManager查找在给定日期输入的Rant对象:
![]() |
getRantsForDay()要做的第一件事是创建一个Query对象,然后设置它的查询参数。本例中只有一个查询参数,但可以想象对于多个参数的情况来说,需要多次调用setParameter()方法。最后一步是执行查询来获取结果。
下面是getRantsForDay()的另外一种实现方法:
![]() |
这种实现方法利用了JpaTemplate提供的find()方法。EntityManager没有这么一个简单的find()方法,能够执行一个查询并接收一个或多个参数。JpaTemplate的find()方法在后台为我们创建和执行查询。
还有一个问题就是我们在哪里获得装配到JpaTemplate的entityManagerFactory Bean,因此在继续介绍Spring与JPA的集成之前,我们先来配置entityManagerFactory Bean。