| 
          
         | 
         
          
          
          本文参考《精通Spring:JavaWeb开发技术详解》,作者:孙卫琴,清华大学出版社出版 
 
Spring Data API只是对JPA API做了轻量级封装,但是Spring Data API无法完成还有一些需要更紧密与ORM软件交互的精细操作,例如在程序中灵活地管理底层ORM软件的持久化缓存,创建和调用持久化层的拦截器等。在这种情况下,Spring框架允许开发人员自定义Repository接口,然后通过JPA API来实现该接口,这样就能充分发挥JPA API的特长,灵活地与持久化层的ORM软件进行深度交互。 
 
下面举例演示创建自定义Repository接口、实现该接口,以及使用该接口的步骤。 
 
(1)创建自定义的CustomerRepository接口,它声明了一个batchSaveCutomer()方法,用于批量保存Customer对象。值得注意的是,CustomerRepository接口并没有继承Spring Data API中的Repository接口:public interface CustomerRepository { 
  public voidbatchSaveCustomer(); 
 
} |  
  (2)创建CustomerRepository接口的实现类CustomerRepositoryImpl,它通过JPA API来实现batchSaveCustomer()方法。例程1是CustomerRepositoryImpl类的源代码。 
 
例程1 CustomerRepositoryImpl.java 
 
…… 
import javax.persistence.*; 
public class CustomerRepositoryImpl implements CustomerRepository { 
 @PersistenceContext(name="entityManagerFactory") 
 
  privateEntityManager entityManager; 
  
 @Transactional 
 
  public voidbatchSaveCustomer(){ 
    for ( inti=0; i<100000; i++ ) { 
      Customercustomer = new Customer("Tom",25); 
      entityManager.persist(customer); 
 
      if ( i% 20 == 0 ) { //单次批量操作的数目为20 
       //清理缓存,执行批量插入20条记录的SQL insert语句 
       entityManager.flush(); 
 
        //清空缓存中的Customer对象 
       entityManager.clear();  
 
      } 
    } 
  } 
} |  
  以上batchSaveCustomer()方法批量保存十万个Customer对象,为了防止内存溢出,每保存20个Customer对象,就会立即刷新数据库,随后清空持久化缓存中的已经保存到数据库中的Customer对象。 
 
(3)修改CustomerDao接口,使它继承CustomerRepository接口: 
 
@Repository 
public interface CustomerDao extendsJpaRepository<Customer,Long>, 
         JpaSpecificationExecutor<Customer>,CustomerRepository{……} |  
  (4)在CustomerService接口和CustomerServiceImpl类中再定义一个batchSaveCustomer()方法,它的具体实现代码如下: 
 
@Transactional 
public void batchSaveCustomer(){ 
 customerDao.batchSaveCustomer(); 
} |  
  程序猿的技术大观园:www.javathinker.net
          
          
          
          
         | 
        
      
 
          |