Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Jpa向所有存储库添加自定义功能,同时向单个存储库添加其他自定义功能_Spring_Jpa_Spring Data_Spring Data Jpa - Fatal编程技术网

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

Spring Jpa向所有存储库添加自定义功能,同时向单个存储库添加其他自定义功能,spring,jpa,spring-data,spring-data-jpa,Spring,Jpa,Spring Data,Spring Data Jpa,这里的Spring文档给出了向所有存储库或单个存储库(而不是两者)添加自定义功能的示例 假设我想将一些自定义函数添加到所有存储库中(使用自定义存储库工厂Bean),而另一些只添加到单个存储库中(文档称使用自定义接口和自定义Impl);我怎样才能做到这一点 一些示例代码,其中我向所有存储库添加了“setCurrentTenansInSession”方法;现在,我想向单个存储库(即MyJpaRepository,与我的自定义存储库工厂一样)添加一个自定义方法,例如“newCustomMethod”。

这里的Spring文档给出了向所有存储库或单个存储库(而不是两者)添加自定义功能的示例

假设我想将一些自定义函数添加到所有存储库中(使用自定义存储库工厂Bean),而另一些只添加到单个存储库中(文档称使用自定义接口和自定义Impl);我怎样才能做到这一点

一些示例代码,其中我向所有存储库添加了“setCurrentTenansInSession”方法;现在,我想向单个存储库(即MyJpaRepository,与我的自定义存储库工厂一样)添加一个自定义方法,例如“newCustomMethod”。我该怎么做

自定义行为界面:

@NoRepositoryBean
public interface MyJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> { 
    public void setCurrentTenantInSession(Object object);       
}
@NoRepositoryBean
公共接口MyJpaRepository扩展了JpaRepository{
public void setCurrentTenantInSession(对象);
}
自定义行为实现:

public class MultiTenantSimpleJpaRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements MyJpaRepository<T, ID> {
    public void setCurrentTenantInSession(Object object) {
        //custom impl
    }
}
公共类MultiTenantsImpleParepository扩展了SimpleParepository实现了MyJpaRepository{
public void setCurrentTenantInSession(对象){
//自定义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);
    }
}
公共类MultiTenantJpaRepositoryFactoryBean扩展了JpaRepositoryFactoryBean{
@凌驾
受保护的RepositoryFactorySupport createRepositoryFactory(EntityManager EntityManager){
返回新的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;
    }
}
公共类MultiTenantJpaRepositoryFactory扩展了JpaRepositoryFactory{
公共多租户JPA存储工厂(EntityManager EntityManager){
超级(实体管理器);
}
@凌驾
受保护的JpaRepository GetTargetRespository(存储元数据元数据,EntityManager EntityManager){
最终JpaEntityInformation repo=新的多租户实施预存(entityInformation,entityManager);
setLockMetadataProvider(LockModeRepositoryPostProcessor.INSTANCE.getLockMetadataProvider());
回购回报;
}
@凌驾
受保护类getRepositoryBaseClass(RepositoryMetadata元数据){
返回multi-tenantsimplejparepository.class;
}
}

您只需将您提到的文档页面上的方法组合起来即可。让
Car
成为您想要拥有自定义存储库的实体

CommonCustomRepository
定义添加到所有回购的方法:

@NoRepositoryBean
public interface CommonCustomRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
    String getCustomValue();
}
定制汽车相关方法的实现

public class CarRepositoryImpl implements CustomCarRepository {

    @PersistenceContext
    private EntityManager em;

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

@NoRepositoryBean
public interface CustomCarRepository {

    public String getCustomCarValue();
}
public interface CarRepository extends CommonCustomRepository<Car, Long>, CustomCarRepository {
}
公共接口CarRepository扩展了CommonCustomRepository,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;
        }
    }
}
公共类CustomRepositoryFactoryBean扩展
JpaRepositoryFactoryBean{
@凌驾
受保护的RepositoryFactorySupport createRepositoryFactory(EntityManager EntityManager){
返回新的CustomRepositoryFactory(entityManager);
}
私有静态类CustomRepositoryFactory扩展了JpaRepositoryFactory{
私人实体管理者实体管理者;
公共客户存储工厂(EntityManager EntityManager){
超级(实体管理器);
this.entityManager=entityManager;
}
@凌驾
受保护对象GetTargetPository(RepositoryMetadata元数据){
返回新的CommonCustomRepositoryImpl((类)metadata.getDomainType(),entityManager);
}
@凌驾
受保护类getRepositoryBaseClass(RepositoryMetadata元数据){
//RepositoryMetadata可以安全地忽略,它由JpaRepositoryFactory使用
//检查超出范围的QueryDslJpaRepository。
返回CommonCustomRepositoryImpl.class;
}
}
}
最后一点配置,就像在文档中一样

<jpa:repositories base-package="com.example" factory-class="com.example.CustomRepositoryFactoryBean"/>


非常感谢kkamenev!从
spring数据共享
1.11开始,为
jpa:repositories
指定
base class=“com.example.CommonCustomRepositoryImpl”
,而不是不推荐的
工厂类
属性。指定基类时不需要工厂。
<jpa:repositories base-package="com.example" factory-class="com.example.CustomRepositoryFactoryBean"/>