这是很有可能的!我可能很晚才参加派对。但这肯定会在未来帮助某人。这是一个完整的解决方案,就像一个魅力!
为实体创建类,如下所示:BaseEntity
@MappedSuperclass
public class AbstractBaseEntity implements Serializable{
@Id @GeneratedValue
private Long id;
@Version
private int version;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public AbstractBaseEntity() {
this.createdAt = LocalDateTime.now();
this.updatedAt = LocalDateTime.now();
}
// getters and setters
}
为 DAO 持久性创建一个通用的 JPA 存储库接口,如下所示:注意。请记住放置,以便 JPA 不会尝试查找存储库的实现!@NoRepositoryBean
@NoRepositoryBean
public interface AbstractBaseRepository<T extends AbstractBaseEntity, ID extends Serializable>
extends JpaRepository<T, ID>{
}
创建一个使用上述基本 JPA 存储库的基本服务类。这是您域中的其他服务接口将简单地扩展的接口,如下所示:
public interface AbstractBaseService<T extends AbstractBaseEntity, ID extends Serializable>{
public abstract T save(T entity);
public abstract List<T> findAll(); // you might want a generic Collection if u prefer
public abstract Optional<T> findById(ID entityId);
public abstract T update(T entity);
public abstract T updateById(T entity, ID entityId);
public abstract void delete(T entity);
public abstract void deleteById(ID entityId);
// other methods u might need to be generic
}
然后为基本JPA存储库创建一个抽象实现,基本CRUD方法也将提供其实现,如下所示:
@Service
@Transactional
public abstract class AbstractBaseRepositoryImpl<T extends AbstractBaseEntity, ID extends Serializable>
implements AbstractBaseService<T, ID>{
private AbstractBaseRepository<T, ID> abstractBaseRepository;
@Autowired
public AbstractBaseRepositoryImpl(AbstractBaseRepository<T, ID> abstractBaseRepository) {
this.abstractBaseRepository = abstractBaseRepository;
}
@Override
public T save(T entity) {
return (T) abstractBaseRepository.save(entity);
}
@Override
public List<T> findAll() {
return abstractBaseRepository.findAll();
}
@Override
public Optional<T> findById(ID entityId) {
return abstractBaseRepository.findById(entityId);
}
@Override
public T update(T entity) {
return (T) abstractBaseRepository.save(entity);
}
@Override
public T updateById(T entity, ID entityId) {
Optional<T> optional = abstractBaseRepository.findById(entityId);
if(optional.isPresent()){
return (T) abstractBaseRepository.save(entity);
}else{
return null;
}
}
@Override
public void delete(T entity) {
abstractBaseRepository.delete(entity);
}
@Override
public void deleteById(ID entityId) {
abstractBaseRepository.deleteById(entityId);
}
}
如何使用上面的摘要 、 、 和 :entity
service
repository
implementation
此处的示例将是一个实体。创建一个域实体,该实体扩展了以下内容:NB。、 、 、 等 将自动包含在实体中MyDomain
AbstractBaseEntity
ID
createdAt
updatedAt
version
MyDomain
AbstractBaseEntity
@Entity
public class MyDomain extends AbstractBaseEntity{
private String attribute1;
private String attribute2;
// getters and setters
}
然后为实体创建一个扩展,如下所示:repository
MyDomain
AbstractBaseRepository
@Repository
public interface MyDomainRepository extends AbstractBaseRepository<MyDomain, Long>{
}
此外,为实体创建一个接口,如下所示:service
MyDomain
public interface MyDomainService extends AbstractBaseService<MyDomain, Long>{
}
然后为扩展实现的实体提供实现,如下所示:MyDomain
AbstractBaseRepositoryImpl
@Service
@Transactional
public class MyDomainServiceImpl extends AbstractBaseRepositoryImpl<MyDomain, Long>
implements MyDomainService{
private MyDomainRepository myDomainRepository;
public MyDomainServiceImpl(MyDomainRepository myDomainRepository) {
super(myDomainRepository);
}
// other specialized methods from the MyDomainService interface
}
Now use your `MyDomainService` service in your controller as follows:
@RestController // or @Controller
@CrossOrigin
@RequestMapping(value = "/")
public class MyDomainController {
private final MyDomainService myDomainService;
@Autowired
public MyDomainController(MyDomainService myDomainService) {
this.myDomainService = myDomainService;
}
@GetMapping
public List<MyDomain> getMyDomains(){
return myDomainService.findAll();
}
// other controller methods
}
铌。确保 用 进行注释,这样就不会尝试查找 Bean 的实现。此外,必须标记为抽象,否则JPA将尝试自动连接类构造函数中的所有子 daos,从而导致 a,因为在创建 bean 时将注入超过 1 个 daos(存储库)!现在,您的 、 和 更易于重用。我们都讨厌样板!AbstractBaseRepository
@NoRepositoryBean
JPA
AbstractBaseServiceImpl
AbstractBaseRepository
NoUniqueBeanDefinitionException
service
repository
implementations
希望这有助于某人。