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就可以了,就像這樣:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM