如何提取"find or create"方法来抽象class? (Spring 数据 Jpa)

How to extract "find or create" method to abstract class? (Spring Data Jpa)

我正在使用 Spring Data JPA,我有一堆这样的存储库:

public interface CustomerRepository extends JpaRepository<Customer, Long> {}

在存储库下我有服务,其中很多都需要像这样实现方法 findOrCreate(String name):

@Override
    @Transactional
    public List<Customer> findOrCreate(final String name) {
        checkNotNull(name);
        List<Customer> result = this.customerRepository.findByName(name);
        if (result.isEmpty()) {
            LOGGER.info("Cannot find customer. Creating a new customer. [name={}]", name);
            Customer customer = new Customer(name);
            return Arrays.asList(this.customerRepository.save(customer));
        }
        return result;
    }

我想将方法​​提取到抽象 class 或某个地方以避免为每个服务、测试等实现它。

摘要 class 可以是这样的:

public abstract class AbstractManagementService<T, R extends JpaRepository<T, Serializable>> {

    protected List<T> findOrCreate(T entity, R repository) {
        checkNotNull(entity);
        checkNotNull(repository);

        return null;
    }

}

问题在于我需要在创建新对象之前按字符串形式查找对象。当然接口 JpaRepository 不提供这种方法。

我该如何解决这个问题?

此致

为编写自定义 JpaRepository 实现的示例创建一个 custom JpaRepository implementation that includes this behaviour. See