当前位置: 首页 > 知识库问答 >
问题:

Spring Jpa将自定义功能添加到所有存储库,同时将其他自定义功能添加到单个存储库

白驰
2023-03-14

这里的 Spring 文档 http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/repositories.html#repositories.custom-implementations 提供了将自定义功能添加到所有存储库或单个存储库的示例,而不是同时添加到两者。

假设我想向所有存储库添加一些自定义函数(使用自定义存储库工厂 Bean),而仅向单个存储库添加其他一些功能(文档说使用自定义接口和自定义 Impl);我怎样才能做到这一点?

一些示例代码,我在所有存储库中添加了“set货币”方法;现在我想在单个存储库中添加一个自定义方法,例如“new搬到方法”(这是一个MyJpaRepostory,就像我的自定义存储库工厂一样)。我该怎么做?

自定义行为界面:

@NoRepositoryBean
public interface MyJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> { 
    public void setCurrentTenantInSession(Object object);       
}

自定义行为实现:

public class MultiTenantSimpleJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyJpaRepository<T, ID> {
    public void setCurrentTenantInSession(Object object) {
        //custom impl
    }
}

自定义存储库工厂bean:

public class MultiTenantJpaRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {

    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
        return new MultiTenantJpaRepositoryFactory(entityManager);
    }
}

最后是自定义存储库工厂:

public class MultiTenantJpaRepositoryFactory extends JpaRepositoryFactory {
    public MultiTenantJpaRepositoryFactory(EntityManager entityManager) {
        super(entityManager);
    }

    @Override
    protected JpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager entityManager) {
        final JpaEntityInformation<?, Serializable> entityInformation = getEntityInformation(metadata.getDomainType());

        final SimpleJpaRepository<?, ?> repo = new MultiTenantSimpleJpaRepository(entityInformation, entityManager);

        repo.setLockMetadataProvider(LockModeRepositoryPostProcessor.INSTANCE.getLockMetadataProvider());
        return repo;
    }

    @Override
    protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
        return MultiTenantSimpleJpaRepository.class;
    }
}

共有1个答案

许胡非
2023-03-14

您只需要结合您提到的文档页面上的方法。让 Car 成为您希望为其设置自定义存储库的实体。

< code > CommonCustomRepository 定义添加到所有仓库的方法:

@NoRepositoryBean
public interface CommonCustomRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    String getCustomValue();
}

本回购的实施:

public class CommonCustomRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements CommonCustomRepository<T, ID> {

    public CommonCustomRepositoryImpl(Class<T> domainClass, EntityManager em) {
        super(domainClass, em);
    }

    public CommonCustomRepositoryImpl(JpaEntityInformation<T, ?> entityInformation,
            EntityManager entityManager) {
        super(entityInformation, entityManager);
    }

    @Override
    public String getCustomValue() {
        return "CustomValue";
    }

}

CarRepostory的自定义方法

@NoRepositoryBean
public interface CustomCarRepository {

    public String getCustomCarValue();
}

定制汽车相关方法的实施

public class CarRepositoryImpl implements CustomCarRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    public String getCustomCarValue() {
        return "CustomCarValue";
    }
}

CarRepository 的组合接口

public interface CarRepository extends CommonCustomRepository<Car, Long>, CustomCarRepository {
}

定制回购工厂,就像在留档

public class CustomRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends
    JpaRepositoryFactoryBean<R, T, I> {

    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {

        return new CustomRepositoryFactory(entityManager);
    }

    private static class CustomRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {

        private EntityManager entityManager;

        public CustomRepositoryFactory(EntityManager entityManager) {
            super(entityManager);

            this.entityManager = entityManager;
        }

        @Override
        protected Object getTargetRepository(RepositoryMetadata metadata) {

            return new CommonCustomRepositoryImpl<T, I>((Class<T>) metadata.getDomainType(), entityManager);
        }

        @Override
        protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {

            // The RepositoryMetadata can be safely ignored, it is used by the JpaRepositoryFactory
            // to check for QueryDslJpaRepository's which is out of scope.
            return CommonCustomRepositoryImpl.class;
        }
    }
}

最后一点配置,就像文档中一样

<jpa:repositories base-package="com.example" factory-class="com.example.CustomRepositoryFactoryBean"/>
 类似资料:
  • 我有通用的基本存储库定义如下: 我的ICustomRepostory存储库接口定义如下: 现在当我使用基本存储库时: 当我在我的服务类中自动连线 OrdeRepository 时,它给了我编译错误: 引起:org.springframework.beans.factory.BeanCreationExc的:错误创建bean的名称'OrderRepostion'定义abc.example.在@Ena

  • 问题内容: 我想将自定义搜索端点添加到我现有的用户存储库中。 我的用户存储库如下所示: 定制控制器: 这将为用户返回正确的搜索端点: 但是对于其他端点,例如Invites: 如何将其仅限于用户?谢谢 问题答案: 我假设您的邀请端点也返回?!每当spring-data- rest序列化a时,都会调用your 。如果您想为用户提供不同的链接并邀请您,则可以选择以下方法: 为搜索端点使用不同的返回类型,

  • 我想从maven转到gradle。 在pom中。xml文件我有一个自定义存储库: 它是一个简单的超文本传输协议Web服务器,带有. jar文件。 如何将此自定义回购添加到生成中。格拉德尔? 我尝试了此代码,但不起作用: 我的定制repo不是maven repo,但我在Gradle文档中没有找到可以指定URL的其他示例。

  • 问题内容: 通过在某个地方注册全局钩子(即,无需修改实际函数本身)或通过其他方式,是否有任何方法可以使任何函数输出console.log语句? 问题答案: 这是用您选择的函数扩展全局名称空间中所有函数的方法: 不利的一面是,调用后创建的任何函数都不会具有其他行为。

  • 我已经搜索了又搜索,除了我称之为“hack方法”的方法之外,找不到其他方法将自定义分类添加到自定义管理菜单中。 然后我注册我的帖子类型并确保它们使用 这可以工作,自定义帖子类型显示在我的自定义菜单中。 但是自定义分类法不接受同一属性的字符串,只接受true或false。 因此,要添加它,您必须创建一个子菜单页 这是一种“黑客”方式。 还有别的办法吗?如果不修改WordPress核心,我可以覆盖re

  • 在我的项目中有几个实体具有相同的属性(对于示例'name'),所以,有可能创建一个存储库,其中使用自定义的select(实体)?因此,我从JpaRepository扩展了我的存储库,我扩展了MyCustomJpaRepository,MyCustomJpaRepository也扩展了JpaRepository,使其能够从JpaRepository授予基本功能? TKS