Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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
Java SpringDataJPA中的多个基本存储库_Java_Spring Data Jpa - Fatal编程技术网

Java SpringDataJPA中的多个基本存储库

Java SpringDataJPA中的多个基本存储库,java,spring-data-jpa,Java,Spring Data Jpa,我目前正在将一个以Hibernate ORM的形式管理JPA的应用程序迁移到Spring Boot 2.0.0和Spring Data JPA 2.0.0。这个应用程序目前有大约50个实体,每个实体都有自己的数据源,我现在想将其迁移到Spring数据存储库。其中许多数据源具有许多非常相似的特性,即使用自定义筛选类进行筛选,或通过某种非其id的唯一键获取实体。我可以很好地实现一个自定义基类,如中所述,但这意味着我必须为每个实体提供定制过滤器,我只需要为其中的10个实体提供定制过滤器 是否有任何可能

我目前正在将一个以Hibernate ORM的形式管理JPA的应用程序迁移到
Spring Boot 2.0.0
Spring Data JPA 2.0.0
。这个应用程序目前有大约50个实体,每个实体都有自己的数据源,我现在想将其迁移到Spring数据存储库。其中许多数据源具有许多非常相似的特性,即使用自定义筛选类进行筛选,或通过某种非其id的唯一键获取实体。我可以很好地实现一个自定义基类,如中所述,但这意味着我必须为每个实体提供定制过滤器,我只需要为其中的10个实体提供定制过滤器

是否有任何可能的方法让Spring数据合并多个自定义存储库实现,如下所示


实体:

@Entity
public class Artist {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    int id;

    @Column(unique = true)
    int secondaryId;
    String name;

    ... constructors, getter, setter, etc ...
}    

@Entity
public class Album {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    int id;

    String name;

    ... constructors, getter, setter, etc ...
}
具有默认实现的自定义存储库:

public interface FilterRepository<T> {
    public T findByFilter(Filter<T> t);
}

public class FilterRepositoryImpl<T> implements AdditionalRepository<T> {
    public T findByFilter(Filter<T> t) {
        ... return something ...
    }
}

public interface FindByFieldRepository<T> {
    public T findByField(String fieldName, Object fieldValue);
}

public class FindByFieldRepositoryImpl<T> implements FindByFieldRepository<T> {
    public T findByField(String fieldName, Object fieldValue) {
        ... return something ...
    }
}
公共接口过滤器存储库{
公共T findByFilter(过滤器T);
}
公共类FilterRepositoryImpl实现附加存储库{
公共T findByFilter(过滤器T){
…归还一些东西。。。
}
}
公共接口FindByFieldRepository{
公共T findByField(字符串字段名、对象字段值);
}
公共类FindByFieldRespositoryImpl实现FindByFieldRespository{
公共T findByField(字符串字段名、对象字段值){
…归还一些东西。。。
}
}
Spring数据存储库

@Repository
public interface ArtistRepository extends JpaRepository<Artist, Integer>, 
        FilterRepository<Artist>, FindByFieldRepository<Artist> {
}

@Repository
public interface AlbumRepository extends JpaRepository<Album, Integer>, 
        FilterRepository<Album> {
}
@存储库
公共界面ArtistRepository扩展了JpaRepository,
过滤器存储{
}
@存储库
公共接口存储库扩展了JpaRepository,
过滤存储{
}

请注意,
ArtistRepository
扩展了两个自定义存储库,而
AlbumRepository
仅扩展了
FilterRepository
。另一个存储库可以扩展
JpaRepository
,但没有自定义的存储库。

这应该可以通过两个接口和一个自定义存储库实现。例如:

步骤1:简单扩展
JpaRepository

步骤3:自定义存储库实现

添加自定义存储库实现,如问题中链接到的文档中所述。还要确保更改JPA配置以使用自定义实现

@NoRepositoryBean
public class ExtendedJpaRepositoryImpl<T>
             extends SimpleJpaRepository<T, Long>
             implements ExtendedJpaRepository<T> {
  ...

  public T findByFilter(Filter<T> t) { ... }

  public T findByField(String fieldName, Object fieldValue) { ... }
}
@NoRepositoryBean
公共类扩展JParepositoryImpl
扩展SimpleParepository
实现ExtendedJpaRepository{
...
公共T findByFilter(筛选器T){…}
公共T findByField(字符串字段名,对象字段值){…}
}
步骤4:根据需要从适当的存储库进行扩展


公共接口AlbumRepository为这种方法扩展了FilteringParepository。

虽然这不是我能想到的最漂亮的解决方案,但它肯定是一个应该有效的解决方案。我现在唯一的“问题”是,我不仅有两个自定义存储库,还有大约5个或6个(将来可能会更多),我无法将它们放入任何层次结构中,一个实现所有这些接口的类有点难看。嗨,我的存储库也有相同的设置,我有一个基本存储库(用@NoRepositoryBean注释)它扩展了Spring的Crudepository,我有单独的存储库接口来扩展我的基本存储库。我发现的一个问题是,在我的数据库中,我所有的实体类数据都在每个实体表中——我试图找出这是否与此有关。
@NoRepositoryBean
public interface ExtendedJpaRepository<T> extends FilteringJpaRepository<T> {
  T findByField(String fieldName, Object fieldValue);
}
@NoRepositoryBean
public class ExtendedJpaRepositoryImpl<T>
             extends SimpleJpaRepository<T, Long>
             implements ExtendedJpaRepository<T> {
  ...

  public T findByFilter(Filter<T> t) { ... }

  public T findByField(String fieldName, Object fieldValue) { ... }
}
public interface AlbumRepository extends FilteringJpaRepository<Album> {}

public interface ArtistRepository extends ExtendedJpaRepository<Artist> {}