>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 12868 个阅读者 刷新本主题
 * 贴子主题:  【Spring专题】通过JPA API实现Repository接口 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2021-10-09 11:10:35     消息  查看  搜索  好友  邮件  复制  引用

本文参考《精通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
  Java面向对象编程-->多线程(上)
  JavaWeb开发-->Web运作原理(Ⅱ)
  JSP与Hibernate开发-->持久化层的映射类型
  Java网络编程-->非阻塞通信
  精通Spring-->通过Axios访问服务器
  Vue3开发-->Vue CLI脚手架工具
  【Vue.js技术专题】分割setup()函数
  【Spring Cloud Alibaba专题】按照集群模式搭建Redis集群
  【持久化专题】为什么JPA和Hibernate的持久化方法都抛出运行...
  【Spring专题】Spring MVC是否过时?
  【Spring专题】@ControllerAdvice注解的用法
  【Vue专题】Vue组件的CSS过渡模式
  【Vue专题】Vue3的计算属性实用范例:实现购物车
  【持久化专题】用@MapsId注解映射派生主键
  【持久化专题】FetchType.LAZY延迟检索策略
  【持久化专题】JPA的事件处理API的用法
  【Java网络编程专题】用Java套接字编写基本的客户/服务器程序
  【Java网络编程专题】优化访问数据库的程序代码的一些技巧
  【持久化专题】通过JPQL查询语句进行批量处理数据
  【JavaWeb专题】选择32位或64位JDK或者Apache HTTP服务器的安...
  我的计算机书籍创作心得
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。