我目前正在将以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
,但不会扩展自定义的存储库。
答案 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了解此方法。