关于在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);
    }
}

 

1
两江总督是码_农
两江总督是码_农
那你去看看源码,某些重要的类,就可以实现baseDao了
0
Donrry
Donrry

引用来自“两江总督是码农”的评论

那你去看看源码,某些重要的类,就可以实现baseDao了

BaseDao我已经实现了,就是在写service的时候能不能通过继承泛型service从而省去一些通用的方法

0
beyondforever68
beyondforever68
该评论暂时无法显示,详情咨询 QQ 群:912889742
0
Donrry
Donrry

引用来自“beyondforever68”的评论

你可以参考一下https://github.com/dzinot/spring-boot-jpa-data-rest-soft-delete,看看custom base repository

谢谢,基本都是到这个程度了,baseService里面怎么实现呢?

这样的话就是每个业务service(userService)里面都要写基本的增删改查方法了

我自己在baseService里面写通用方法还没有调试完成

beyondforever68
beyondforever68
通用service吗,BaseService<T>,T为jpa entity,根据T找repository,相当于参考jparepository,写一套service,是这个意思吗
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
Leoops
Leoops
import java.io.Serializable;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends JpaRepository<T, Serializable>, JpaSpecificationExecutor<T> {

}	
import java.io.Serializable;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;

public interface BaseService<T,ID extends Serializable> {
		
	T save(T t);
	
	T update(T t);

	T get(String id);

	void delete(String id);
	
	void delete(T t);
	
	boolean exists(String id);

	long count();

	List<T> findAll();
	
	List<T> findAll(Sort sort);
	
	List<T> findAll(Specification<T> specification);
	
	Page<T> findAll(Pageable pageable);
	
	Page<T> findPage(Specification<T> specification, Pageable pageable);
	
}
import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;

import cn.tzcoin.renwubang.repository.BaseRepository;
import cn.tzcoin.renwubang.service.BaseService;

public class BaseServiceImpl<T,ID extends Serializable> implements BaseService<T, ID> {

	@Autowired
	BaseRepository<T, Serializable> baseRepository;
	
	@Override
	public T save(T t) {
		return baseRepository.save(t);
	}

	@Override
	public T update(T t) {
		return baseRepository.saveAndFlush(t);
	}

	@Override
	public T get(String id) {
		return baseRepository.getOne(id);
	}

	@Override
	public void delete(String id) {
		baseRepository.delete(id);
	}

	@Override
	public void delete(T t) {
		baseRepository.delete(t);
	}

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

	@Override
	public long count() {
		return baseRepository.count();
	}

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

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

	@Override
	public List<T> findAll(Specification<T> specification) {
		// TODO Auto-generated method stub
		return null;
	}

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

	@Override
	public Page<T> findAll(Specification<T> specification, Pageable pageable) {
		// TODO Auto-generated method stub
		return null;
	}

拿去不谢 @红薯,代码为什么没有高亮呢?

迈克尔
BaseServiceImpl里 @Autowired BaseRepository<T, ID> baseRepository; 报错了
boboges
boboges
执行了下代码好像会有问题BaseServiceImpl是需要注解上吗还是别的什么问题
0
鹏程浪子
鹏程浪子

咋使用啊

这个BaseRepository没有Autowired呀

0
人间惆怅客1
人间惆怅客1

这个怎么调用啊?

Donrry
Donrry
回复 @迈克尔 : yysf 贴的代码没问题啊。
迈克尔
回复 @wells杨 : BaseServiceImpl 里 @Autowired BaseRepository 报错了
Donrry
Donrry
什么意思啊?就最佳答案那个拿过去就可以直接用了
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部