Spring Data JPA中的多个基本存储库

时间:2017-03-14 08:41:56

标签: java spring-data-jpa

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

有没有办法让Spring Data合并多个自定义存储库实现,如下所示?

实体:

@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 ...
    }
}

Spring Data Repositories

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

@Repository
public interface AlbumRepository extends JpaRepository<Album, Integer>, 
        FilterRepository<Album> {
}

请注意ArtistRepository扩展了两个自定义存储库,而AlbumRepository只扩展了FilterRepository。另一个存储库可能会扩展JpaRepository,但不会扩展自定义的存储库。

1 个答案:

答案 0 :(得分:1)

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

  

第1步JpaRepository

的简单扩展
@NoRepositoryBean
public interface FilteringJpaRepository<T> extends JpaRepository<T, Long> {
  T findByFilter(Filter<T> t);
}
  

第2步JpaRepository

的更复杂的扩展
@NoRepositoryBean
public interface ExtendedJpaRepository<T> extends FilteringJpaRepository<T> {
  T findByField(String fieldName, Object fieldValue);
}
  

第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) { ... }
}
  

第4步:根据需要从相应的存储库扩展

public interface AlbumRepository extends FilteringJpaRepository<Album> {}

public interface ArtistRepository extends ExtendedJpaRepository<Artist> {}

由于功能存储库仅扩展了所需的存储库,因此它们的使用者只能看到适合它们的方法。

请参阅sample app了解此方法。