com.kasinf.framework.rest.web.service.BaseService Maven / Gradle / Ivy
The newest version!
package com.kasinf.framework.rest.web.service;
import com.kasinf.framework.core.exception.ValidateError;
import com.kasinf.framework.core.exception.ValidateException;
import com.kasinf.framework.rest.eneity.AbstractEntity;
import com.kasinf.framework.rest.repository.BaseRepository;
import com.kasinf.framework.rest.support.Searchable;
import com.kasinf.framework.rest.web.util.ValidatorUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import javax.transaction.Transactional;
import javax.validation.ConstraintViolation;
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @param 操作的实体对象
* @param 实体对象的ID
* @author lkhsh
* 通用Service接口层
*/
@SuppressWarnings("all")
public interface BaseService {
/**
* 获取实体的存储库
*
* @return {@link BaseRepository}
*/
BaseRepository getBaseRepository();
/**
* 在创建之前触发的操作,返回false可阻止创建
*
* @param t 实体
* @return 是否继续操作
*/
default boolean beforeCreate(T t) {
return true;
}
/**
* 在创建之后触发的操作,返回进一步加工的实体
*
* @param t 保存后的实体
* @return 人工加工的实体
*/
default T afterCreate(T t) {
return t;
}
/**
* 使用Hibernate Validator验证存入数据库的数据
*
* @param t 待验证实体
*/
default void validator(T t) {
Set> validate = ValidatorUtils.validate(t);
if (!validate.isEmpty()) {
Set errors = new HashSet<>();
StringBuffer sb = new StringBuffer();
validate.forEach(c -> {
errors.add(new ValidateError(c.getPropertyPath().toString(), c.getMessage(), c.getInvalidValue()));
sb.append(c.getMessage()).append(";");
});
throw new ValidateException(errors, sb.toString());
}
}
/**
* 创建实体
*
* @param t 要保存的实体
* @return 保存后的实体
*/
@Transactional(rollbackOn = Exception.class)
default T create(T t) {
validator(t);
return beforeCreate(t) ? afterCreate(getBaseRepository().save(t)) : null;
}
/**
* 不走事物,验证,以及保存前,保存后方法。直接保存实体。
*
* @param t 要保存的实体
* @return 保存后的实体
*/
default T saveAndFlush(T t) {
return getBaseRepository().saveAndFlush(t);
}
/**
* 批量保存
*
* @param entities 实体列表
*/
default void saveAll(Iterable entities) {
getBaseRepository().saveAll(entities);
}
/**
* 通过主键删除实体
*
* @param id 主键
*/
@Transactional(rollbackOn = Exception.class)
default void delete(ID id) {
getBaseRepository().deleteById(id);
afterDelete(id);
}
default void afterDelete(ID id) {
}
/**
* 在删除之前进行的操作
*
* @param t 要删除的实体
* @return 是否继续操作
*/
default boolean beforeDelete(T t) {
return true;
}
/**
* 删除实体之后进行的操作
*/
default void afterDelete(T t) {
}
/**
* 删除对应实体
*
* @param t 要删除的实体
*/
@Transactional(rollbackOn = Exception.class)
default void delete(T t) {
if (beforeDelete(t)) {
getBaseRepository().delete(t);
}
afterDelete(t);
}
/**
* 通过id删除一组对象
*
* @param ids 要删除的id
*/
@Transactional(rollbackOn = Exception.class)
default void delete(ID[] ids) {
getBaseRepository().deleteInBatch(ids);
afterDelete(ids);
}
/**
* 删除实体之后进行的操作
*
* @param ids 主键列表
*/
default void afterDelete(ID[] ids) {
}
/**
* 更新之前执行的操作,可通过返回false阻止更新
*
* @param t 要更新的实体
* @return 是否继续执行
*/
default boolean beforeUpdate(T t) {
return true;
}
/**
* 进一步对更新后的实体做人工干预
*
* @param t 更新之后的实体
* @return 人工干预之后的实体
*/
default T afterUpdate(T t) {
return t;
}
/**
* 更新实体
*
* @param t 要更新的实体
* @return 更新后的实体
*/
@Transactional(rollbackOn = Exception.class)
default T update(T t) {
validator(t);
return beforeUpdate(t) ? afterUpdate(getBaseRepository().save(t)) : null;
}
/**
* 通过主键查询实体
*
* @param id 主键
* @return 查询到的实体
*/
default T getOne(ID id) {
return getBaseRepository().findById(id).orElse(null);
}
/**
* 判断实体是否存在
*
* @param id 实体id
* @return 是否存在
*/
default boolean exists(ID id) {
return getBaseRepository().existsById(id);
}
/**
* 统计实体总数
*
* @return 总数
*/
default long count() {
return getBaseRepository().count();
}
/**
* 查询所有实体
*
* @return 查询到的所有实体
*/
default List findAll() {
return getBaseRepository().findAll();
}
/**
* 通过排序条件查询列表
*
* @param sort 排序条件
* @return 查询结果
*/
default List findAll(Sort sort) {
return getBaseRepository().findAll(sort);
}
/**
* 返回分页排序的结果
*
* @param pageable 分页排序条件
* @return 查询结果
*/
default Page findAll(Pageable pageable) {
return getBaseRepository().findAll(pageable);
}
/**
* 按条件分页并排序查询实体
*
* @param searchable 分页条件
* @return 查询的结果
*/
default Page findAll(Searchable searchable) {
return getBaseRepository().findAll(searchable);
}
/**
* 按条件不分页不排序查询实体
*
* @param searchable 条件
* @return 查询到的实体
*/
default List findAllWithoutPageAndSort(Searchable searchable) {
searchable.removePageable();
searchable.removeSort();
return getBaseRepository().findList(searchable);
}
/**
* 按条件查询排序后的实体
*
* @param searchable 查询条件
* @return 查询结果
*/
default List findAllWithSort(Searchable searchable) {
searchable.removePageable();
return getBaseRepository().findList(searchable);
}
/**
* 按条件查询实体数量
*
* @param searchable 查询条件
* @return 实体数量
*/
default long count(Searchable searchable) {
return getBaseRepository().count(searchable);
}
/**
* 删除全部实体
*/
@Transactional(rollbackOn = Exception.class)
default void deleteAll() {
getBaseRepository().deleteAll();
}
/**
* 通过id列表查询全部
*
* @param ids id列表
* @return 列表
*/
default List findWithIds(Iterable ids) {
return getBaseRepository().findAllById(ids);
}
}