+
 新版

关于在Spring boot JPA中使用像hibernate中的父接口BaseService

Donrry 发布于 2018/05/04 10:07
阅读 5K+
收藏 2

最近在看spring boot jpa模块,基本用法和思路基本都能理解,也能上手使用,

但是以前用hibernate的时候经常会用到泛型接口BaseService,里面会实现一些通用的增删改查方法,这样在业务service中就不必要写重复的方法了。

现在在jpa里面不知道怎么实现,在网上搜了搜也基本找不到关于这块的资料,有没有大神讲下。。。。。。。。。

我说的是service层,不是dao层哦,各位大神~

加载中
1
yysf
yysf

贴上我的代码

@NoRepositoryBean
public interface BaseRepository<T,ID extends Serializable> extends JpaRepository<T,ID> {
}
public interface BaseService<T,ID extends Serializable,R extends BaseRepository<T,ID>>{
    /**
     * 获取Repository
     * @return
     */
    R getRepository();
    T updateOne(ID id, T entity);
    T updateOne(T entity, T db);
    <TT,TID extends Serializable> TT updateOne(BaseRepository<TT, TID> baseRepository, TID id, TT entity);
    T saveOne(T entity);
    <TT,TID extends Serializable> TT saveOne(BaseRepository<TT, TID> baseRepository, TT entity);
    T findOne(ID id);
    void deleteById(ID id);
    boolean exists(ID id);
    List<T> findAll();
    List<T> findAll(Example<T> example);
    Page<T> findAll(Pageable pageable);

    T saveOrUpdate(ID id, T t);
}
public abstract class BaseServiceImpl<T,ID extends Serializable,R extends BaseRepository<T,ID>> implements BaseService<T,ID,R> {
    @PersistenceContext
    protected EntityManager em;
    @Autowired
    protected R baseRepository;
    @Override
    public T findOne(ID id) {
        return baseRepository.findOne(id);
    }
    @Override
    public R getRepository() {
        return baseRepository;
    }
    @Transactional
    @Override
    public T updateOne(ID id,T entity) {
        return updateOne(baseRepository,id,entity);
    }

    @Transactional
    @Override
    public T updateOne(T entity,T tdb) {
        CommonUtils.myCopyProperties(entity,tdb);
        return tdb;
    }


    @Transactional
    @Override
    public <TT, TID extends Serializable> TT updateOne(BaseRepository<TT, TID> baseRepository, TID id, TT entity) {
        TT tdb=baseRepository.findOne(id);
        CommonUtils.myCopyProperties(entity,tdb);
        return tdb;
    }
    @Override
    public T saveOne(T entity) {
        return saveOne(baseRepository,entity);
    }
    @Override
    public <TT, TID extends Serializable> TT saveOne(BaseRepository<TT, TID> baseRepository, TT entity) {
        return baseRepository.save(entity);
    }
    @SuppressWarnings("all")
    @Override
    public void deleteById(ID id) {
        baseRepository.delete(id);
    }

    @Override
    public boolean exists(ID id) {
        return baseRepository.exists(id);
    }

    @Override
    public List<T> findAll(Example<T> example) {
        return baseRepository.findAll(example);
    }
    @Override
    public List<T> findAll() {
        return baseRepository.findAll();
    }

    @Override
    public Page<T> findAll(Pageable pageable) {
        return baseRepository.findAll(pageable);
    }

    @Transactional
    @Override
    public T saveOrUpdate(ID id, T t){
        if(id!=null){
            T db=findOne(id);
            if(db!=null){
                return updateOne(id,t);
            }
        }
        return saveOne(t);
    }
}

 

0
f
freezingsky

官方的JPA文档中有讲到,如何扩展DAO

0
Donrry
Donrry

引用来自“yysf”的评论

贴上我的代码

@NoRepositoryBean
public interface BaseRepository<T,ID extends Serializable> extends JpaRepository<T,ID> {
}
public interface BaseService<T,ID extends Serializable,R extends BaseRepository<T,ID>>{
    /**
     * 获取Repository
     * @return
     */
    R getRepository();
    T updateOne(ID id, T entity);
    T updateOne(T entity, T db);
    <TT,TID extends Serializable> TT updateOne(BaseRepository<TT, TID> baseRepository, TID id, TT entity);
    T saveOne(T entity);
    <TT,TID extends Serializable> TT saveOne(BaseRepository<TT, TID> baseRepository, TT entity);
    T findOne(ID id);
    void deleteById(ID id);
    boolean exists(ID id);
    List<T> findAll();
    List<T> findAll(Example<T> example);
    Page<T> findAll(Pageable pageable);

    T saveOrUpdate(ID id, T t);
}
public abstract class BaseServiceImpl<T,ID extends Serializable,R extends BaseRepository<T,ID>> implements BaseService<T,ID,R> {
    @PersistenceContext
    protected EntityManager em;
    @Autowired
    protected R baseRepository;
    @Override
    public T findOne(ID id) {
        return baseRepository.findOne(id);
    }
    @Override
    public R getRepository() {
        return baseRepository;
    }
    @Transactional
    @Override
    public T updateOne(ID id,T entity) {
        return updateOne(baseRepository,id,entity);
    }

    @Transactional
    @Override
    public T updateOne(T entity,T tdb) {
        CommonUtils.myCopyProperties(entity,tdb);
        return tdb;
    }


    @Transactional
    @Override
    public <TT, TID extends Serializable> TT updateOne(BaseRepository<TT, TID> baseRepository, TID id, TT entity) {
        TT tdb=baseRepository.findOne(id);
        CommonUtils.myCopyProperties(entity,tdb);
        return tdb;
    }
    @Override
    public T saveOne(T entity) {
        return saveOne(baseRepository,entity);
    }
    @Override
    public <TT, TID extends Serializable> TT saveOne(BaseRepository<TT, TID> baseRepository, TT entity) {
        return baseRepository.save(entity);
    }
    @SuppressWarnings("all")
    @Override
    public void deleteById(ID id) {
        baseRepository.delete(id);
    }

    @Override
    public boolean exists(ID id) {
        return baseRepository.exists(id);
    }

    @Override
    public List<T> findAll(Example<T> example) {
        return baseRepository.findAll(example);
    }
    @Override
    public List<T> findAll() {
        return baseRepository.findAll();
    }

    @Override
    public Page<T> findAll(Pageable pageable) {
        return baseRepository.findAll(pageable);
    }

    @Transactional
    @Override
    public T saveOrUpdate(ID id, T t){
        if(id!=null){
            T db=findOne(id);
            if(db!=null){
                return updateOne(id,t);
            }
        }
        return saveOne(t);
    }
}

 

应该就是这种!先谢过,一会试试!

0
鹏程浪子
鹏程浪子

咋使用啊

这个BaseRepository没有Autowired呀

0
数字凡人
数字凡人

这个怎么调用啊?

Donrry
Donrry
什么意思啊?就最佳答案那个拿过去就可以直接用了
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部