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