领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多Spring 2.0 添加了对 JPA 数据访问标准的支持,并提供了所有可以预期的标准 Spring 支持类。Mark Fisher 有一篇很棒的文章介绍了如何使用此新支持。但是,我们不断收到一个问题,即为什么有人会想要使用 Spring 类(JpaTemplate)来访问EntityManager。这个问题的最佳答案在于JpaTemplate提供的增值功能。除了提供Spring 数据访问的标志性的一行式便利方法之外,它还提供了自动参与事务和从PersistenceException到 Spring 的DataAccessException层次结构的转换。
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" />
<bean class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
JpaTransactionManager 负责创建EntityManager、打开事务并将它们绑定到当前线程上下文。<tx:annotation-driven /> 只是告诉 Spring 将事务性建议放在任何在其上具有@Transactional注释的类或方法上。您现在只需编写您的主线 DAO 逻辑,而不必担心事务语义。
public Collection loadProductsByCategory(String category) {
return entityManager.createQuery("from Product p where p.category = :category")
.setParameter("category", category).getResultList();
}
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
public class ProductDaoImpl implements ProductDao {
private EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this. entityManager = entityManager;
}
public Collection loadProductsByCategory(String category) {
return entityManager.createQuery("from Product p where p.category = :category")
.setParameter("category", category).getResultList();
}
}
通过添加单个 bean 定义,Spring 容器将充当 JPA 容器并从您的EntityManagerFactory注入EnitityManager。
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
@Repository
public class ProductDaoImpl implements ProductDao {
private EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this. entityManager = entityManager;
}
public Collection loadProductsByCategory(String category) {
return entityManager.createQuery("from Product p where p.category = :category")
.setParameter("category", category).getResultList();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" />
<bean id="productDaoImpl" class="product.ProductDaoImpl"/>
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
</beans>
就是这样。两个注解和四个 bean 定义。