zoukankan      html  css  js  c++  java
  • springboot2.0 JPA配置自定义repository,并作为基类BaseRepository使用

     

    springboot2.0 JPA配置自定义repository,并作为基类BaseRepository使用

    原文链接:https://www.cnblogs.com/blog5277/p/10661441.html

    原文作者:博客园--曲高终和寡

    *******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文****************

    可能是我找的方法不对,但是我找配置一个自定义基类repository没一个人的文章的说的完全正确、不走弯路的,所以我就来写一个。

    上一章中设置的批量插入、更新,肯定各个repository里面都要用,他们应该被放进BaseRepository里面,我们建一个这个接口:

    /**
     * @Author:ShadowSaint
     * @Date:19-4-4 上午3:45
     * @Description: 框架通用的基础repository接口
     */
    @NoRepositoryBean
    public interface BaseRepository<T, ID extends Serializable>
            extends 
            JpaRepository<T, ID>, 
            JpaSpecificationExecutor<T>,
            PagingAndSortingRepository<T, ID> {
    
    
        <S extends T> Iterable<S> batchSave(Iterable<S> var1);
    
        <S extends T> Iterable<S> batchUpdate(Iterable<S> var1);
    
    }

    我们再建一个BaseRepository的实现类

    /**
     * @Author:ShadowSaint
     * @Date:19-4-4 上午3:50
     * @Description: TODO
     */
    public class BaseRepositoryImpl<T, ID extends Serializable> 
            extends SimpleJpaRepository<T, ID> 
            implements BaseRepository<T, ID> {
    
        private static final int BATCH_SIZE = 500;
    
        private EntityManager em;
    
        public BaseRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager em) {
            super(entityInformation, em);
            this.em = em;
    
        }
    
        public BaseRepositoryImpl(Class<T> domainClass, EntityManager em) {
            super(domainClass, em);
            this.em = em;
        }
    
    
        @Override
        @Transactional
        public <S extends T> Iterable<S> batchSave(Iterable<S> var1) {
            Iterator<S> iterator = var1.iterator();
            int index = 0;
            while (iterator.hasNext()){
                em.persist(iterator.next());
                index++;
                if (index % BATCH_SIZE == 0){
                    em.flush();
                    em.clear();
                }
            }
            if (index % BATCH_SIZE != 0){
                em.flush();
                em.clear();
            }
            return var1;
        }
    
        @Override
    @Transactional
    public <S extends T> Iterable<S> batchUpdate(Iterable<S> var1) { Iterator<S> iterator = var1.iterator(); int index = 0; while (iterator.hasNext()){ em.merge(iterator.next()); index++; if (index % BATCH_SIZE == 0){ em.flush(); em.clear(); } } if (index % BATCH_SIZE != 0){ em.flush(); em.clear(); } return var1; } }

     接下来在springboot的主入口:XXXXApplication里面添加一个设置

    @EnableJpaRepositories(repositoryBaseClass = BaseRepositoryImpl.class)

    好了,到这里就可以了。

    其他各种教程让你设置什么Factory、FactoryBean什么的,完全不用,就这样就已经可以了。

    这样让你各个业务相关的Repository继承这个BaseRepository就可以了,就像这样:

  • 相关阅读:
    【leetcode】三维形体投影面积
    【leetcode】区域和检索
    【leetcode】二叉搜索树的范围和
    【leetcode】数组序号转换
    【leetcode】赎金信
    【leetcode】矩形重叠
    【leetcode】转变日期格式
    053-158
    053-268
    053-160
  • 原文地址:https://www.cnblogs.com/blog5277/p/10661441.html
Copyright © 2011-2022 走看看