All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.kasinf.framework.rest.web.service.BaseService Maven / Gradle / Ivy

There is a newer version: 1.4.0
Show newest version
package com.kasinf.framework.rest.web.service;


import com.kasinf.framework.rest.repository.BaseRepository;
import com.kasinf.framework.rest.eneity.AbstractEntity;
import com.kasinf.framework.rest.support.Searchable;
import com.kasinf.framework.core.exception.ValidateError;
import com.kasinf.framework.core.exception.ValidateException;
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接口层
 */
public interface BaseService {

    /**
     * 获取实体的存储库
     *
     * @return {@link BaseRepository}
     */
    BaseRepository getBaseRepository();

    /**
     * 在创建之前触发的操作,返回false可阻止创建
     *
     * @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<>();
            validate.forEach(c -> {
                errors.add(new ValidateError(c.getPropertyPath().toString(), c.getMessage(), c.getInvalidValue()));
            });
            throw new ValidateException(errors, "验证出错");
        }
    }

    /**
     * 创建实体
     *
     * @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 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);
    }

    /**
     * 删除实体之后进行的操作
     */
    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();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy