我目前正在将一个以 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 ...
} …Run Code Online (Sandbox Code Playgroud) 我有一些Spring Data通过片段扩展的存储库,如here所述。只要我只EntityManager在这个实现中注入 ,这就可以正常工作。
其中一个实现是通用的,因此JpaEntityInformation当前实体需要一个实例才能正常工作(我基本上只需要实体名称和 java 类型)。如果我也尝试在构造函数中“自动装配” this,我会收到一个异常,指出找不到类的 bean JpaEntityInformation。
我理解这个异常,但我想知道是否有另一种方法来获取为当前存储库实例创建的实体的名称和类。我认为应该可以JpaEntityInformation通过构造函数以某种方式获取,因为如果您指定自定义存储库基类(我不想这样做),这就是完成的方式。
您可以在下面找到我刚刚描述的用例。
@NoRepositoryBean
@RequiredArgsConstructor
public class FindByFieldRepositoryImpl<T> implements FindByFieldRepository<T> {
private final JpaEntityInformation<T, ?> entityInformation;
private final EntityManager manager;
@Override
public T findByField(String field, Object value) {
return createQuery(field, value).getSingleResult();
}
private TypedQuery<T> createQuery(String fieldName, Object fieldValue) {
String entityName = entityInformation.getEntityName();
Class<T> entityType = entityInformation.getJavaType();
String queryString = String.format("FROM %s WHERE %s = :value", entityName, fieldName);
TypedQuery<T> query = …Run Code Online (Sandbox Code Playgroud)