在 jpa hibernate简单配置 中已经将jpa 和hibernate配置好了,但是依然要我们来手动管理entityManager, 接下来就要 加入spring的支持,让spring替我们来管理 entityManager。
所用到的jar包:
spring 4.0.3 core,
hibernate 4.2.16(required and jpa),
spring-data-commons-1.8.0.RELEASE.jar,
spring-data-jpa-1.6.0.RELEASE.jar, (如果是1.7.2版本的会报异常 NoSuchMethod: registerIfNotAlreadyRegistered())
commons-logging-1.1.3,
slf4j-api-1.7.7
spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<!-- 开启组件扫描,即spring会扫描 base-package中的类,
将@Component, @Repository, @Service, and @Controller注解的bean扫描到spring上下文中 -->
<context:component-scan base-package="com.jt"/>
<!-- jpa 的entitymanagerfactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!-- 这个provider也可以在 persistence.xml 中配置 -->
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"></property>
</bean>
<!-- jpa的事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
注意在 持久层实现中,用 @PersistenceContext 来注入 entityManager
EmployeeDaoImpl.java
package com.jt.dao.impl;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import com.jt.dao.EmployeeDao;
import com.jt.entity.Employee;
@Repository
public class EmployeeDaoImpl implements EmployeeDao {
@PersistenceContext
private EntityManager entityManager;
@Override
public void save(Employee employee) {
entityManager.persist(employee);
}
}
再进一步用spring data jpa简化,连dao实现都不用写,让spring替我们实现持久层。
在spring.xml加如下配置:
<!-- 让spring 来实现base-package 中的持久层接口 -->
<jpa:repositories base-package="com.jt.dao" entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager"></jpa:repositories>
EmployeeDaoJpa.java
package com.jt.dao;
import org.springframework.data.repository.Repository;
import com.jt.entity.Employee;
public interface EmployeeDaoJpa extends Repository<Employee, Integer>{
void save(Employee employee);
Employee findByEmployeeId(Integer empId);
}
然而,Repository并没有提供任何方法,业务模块多的时候,每一个dao都要增删改查方法,非常麻烦,这时可以继承 CrudRepository 内置了10个 CRUD方法,如果需要分页,可以继承 PagingAndSortingRepository。