solr crud_Spring Data Solr教程:CRUD(差不多)
solr crud
在我的Spring Data Solr教程的上一部分中,我们学习了如何配置Spring Data Solr。 现在该迈出一步,了解我们如何管理Solr实例中存储的信息。 此博客文章描述了我们如何向Solr索引添加新文档,如何更新现有文档的信息以及如何从索引中删除文档。
通过执行以下步骤,我们可以对示例应用程序进行必要的修改:
- 创建一个文档类,其中包含存储在Solr索引中的信息。
- 为我们的Spring Data Solr存储库创建一个存储库接口。
- 创建一个使用创建的存储库的服务。
- 使用创建的服务。
以下各节将更详细地描述这些步骤。
注意 :这些博客条目提供了其他信息,可帮助我们理解此博客条目中描述的概念:
- 使用Maven运行Solr
- Spring Data Solr教程:Solr简介
- Spring Data Solr教程:配置
创建文档类
第一步是创建一个文档类,其中包含添加到Solr索引中的信息。 文档类基本上只是一个POJO,它通过遵循以下规则来实现:
- @Field批注用于在POJO的字段和Solr文档的字段之间创建链接。
- 如果Bean的字段名称与文档的字段名称不同,则必须以@Field批注的值给出文档的字段名称。
- @Field批注可以应用于字段或setter方法。
- Spring Data Solr默认情况下假设文档的id字段的名称为'id'。 我们可以通过使用@Id注释对id字段进行注释来覆盖此设置。
- Spring Data Solr(版本1.0.0.RC1)要求文档ID的类型为String 。
更多信息 :
- Solrj @ Solr维基
让我们继续创建我们的文档类。
在我的Spring Data Solr教程的第一部分中,我们了解到必须将每个todo条目的id , 描述和标题存储到Solr索引中。
因此,我们可以按照以下步骤为待办事项创建文档类:
- 创建一个名为TodoDocument的类。
- id字段添加到TodoDocument类,并与@Field注解注释字段。 使用@Id注释对字段进行注释(由于id字段的名称为'id',所以这不是必需的,但我想在此处演示其用法)。
- 说明字段添加到TodoDocument类,并与@Field注解注释这一领域。
- 标题字段添加到TodoDocument并与@Field注解注释这一领域。
- 在TodoDocument类的字段中创建getter方法。
- 创建一个静态内部类,该内部类用于构建新的TodoDocument对象。
- 将静态getBuilder()方法添加到TodoDocument类。 此方法的实现返回一个新的TodoDocument.Builder对象。
TodoDocument类的源代码如下所示:
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;public class TodoDocument {@Id@Fieldprivate String id;@Fieldprivate String description;@Fieldprivate String title;public TodoDocument() {}public static Builder getBuilder(Long id, String title) {return new Builder(id, title);}//Getters are omittedpublic static class Builder {private TodoDocument build;public Builder(Long id, String title) {build = new TodoDocument();build.id = id.toString();build.title = title;}public Builder description(String description) {build.description = description;return this;}public TodoDocument build() {return build;}}
}
创建存储库界面
Spring Data Solr存储库的基本接口是SolrCrudRepository <T,ID>接口,每个存储库接口都必须扩展此接口。
当扩展SolrCrudRepository <T,ID>接口时,我们必须提供两个类型参数,下面将对其进行描述:
- T type参数表示我们的文档类的类型。
- ID类型参数表示文档ID的类型。 Spring Data Solr(版本1.0.0.RC1)要求文档的ID为String 。
我们可以按照以下步骤创建存储库接口:
- 创建一个名为TodoDocumentRepository的接口。
- 扩展SolrCrudRepository接口,并提供我们的文档类的类型及其ID作为类型参数。
TodoDocumentRepository接口的源代码如下所示:
import org.springframework.data.solr.repository.SolrCrudRepository;public interface TodoDocumentRepository extends SolrCrudRepository<TodoDocument, String> {
}
创建服务
下一步是创建使用创建的Solr存储库的服务。 我们可以按照以下步骤创建此服务:
- 创建服务接口。
- 实现创建的接口。
下面将更详细地描述这些步骤。
创建服务接口
我们的服务接口声明了以下两种方法:
- void addToIndex(Todo todoEntry)方法将todo条目添加到索引。
- void deleteFromIndex(Long id)方法从索引中删除待办事项。
注意:我们可以使用addToIndex()方法将新的待办事项添加到Solr索引中,并更新现有待办事项的信息。 如果现有文档的ID与新文档的ID相同,则将删除旧文档,并将新文档的信息保存到Solr索引中(有关更多详细信息 ,请参见SchemaXML @ Solr Wiki )。
TodoIndexService接口的源代码如下所示:
public interface TodoIndexService {public void addToIndex(Todo todoEntry);public void deleteFromIndex(Long id);
}
实施创建的接口
我们通过执行以下步骤来实现服务接口:
- 创建我们的服务类的框架实现。
- 实现用于将文档添加到Solr索引的方法。
- 实现用于从Solr索引中删除文档的方法。
下面将更详细地描述这些步骤。
创建服务类的框架实现
我们可以按照以下步骤创建服务接口的框架实现:
- 创建一个名为RepositoryTodoIndexService的类,并使用@Service注释对该类进行注释。 该注释将该类标记为服务,并确保在类路径扫描期间将检测到该类。
- 将TodoDocumentRepository字段添加到RepositoryTodoIndexService类,并使用@Resource注释对该字段进行注释。 该注释指示Spring IoC容器将实际的存储库实现注入服务的存储库字段。
我们的虚拟服务实现的源代码如下所示:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;//Add methods here
}
将文档添加到Solr索引
我们可以按照以下步骤创建将新文档添加到Solr索引的方法:
- 将addToIndex()方法添加到RepositoryTodoIndexService类中,并使用@Transactional注释对该方法进行注释。 这确保了我们的Spring Data Solr存储库将参与Spring托管的事务 。
- 通过使用构建器模式创建一个新的TodoDocument对象。 设置创建的文档的id , 标题和描述 。
- 通过调用TodoDocumentRepository接口的save()方法将文档添加到Solr索引中。
创建的方法的源代码如下所示:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;@Transactional@Overridepublic void addToIndex(Todo todoEntry) {TodoDocument document = TodoDocument.getBuilder(todoEntry.getId(), todoEntry.getTitle()).description(todoEntry.getDescription()).build();repository.save(document);}//Add deleteFromIndex() method here
}
从Solr索引中删除文档
我们可以按照以下步骤创建一种从Solr索引中删除文档的方法:
- 将deleteFromIndex()方法添加到RepositoryTodoDocumentService类,并使用@Transactional注释对该方法进行注释。 这确保了我们的Spring Data Solr存储库将参与Spring托管的事务 。
- 通过调用TodoDocumentRepository接口的delete()方法从Solr索引中删除文档。
创建的方法的源代码如下所示:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Service
public class RepositoryTodoIndexService implements TodoIndexService {@Resourceprivate TodoDocumentRepository repository;//Add addToIndex() method here@Transactional@Overridepublic void deleteFromIndex(Long id) {repository.delete(id.toString());}
}
使用创建的服务
我们的最后一步是使用我们先前创建的服务。 我们可以通过对RepositoryTodoService类进行以下修改来做到这一点:
- 将TodoIndexService字段添加到RepositoryTodoService类,并使用@Resource批注对此字段进行批注。 该注释指示Spring IoC容器将创建的RepositoryTodoIndexService对象注入到服务的indexService字段中。
- 调用在RepositoryTodoService类的add()方法的TodoIndexService接口的addToIndex()方法。
- 调用在RepositoryTodoService类的deleteById()方法TodoIndexService接口的deleteFromIndex()方法。
- 调用在RepositoryTodoService类的update()方法的TodoIndexService接口的addToIndex()方法。
RepositoryTodoService的源代码如下所示:
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.List;@Service
public class RepositoryTodoService implements TodoService {@Resourceprivate TodoIndexService indexService;@Resourceprivate TodoRepository repository;@PreAuthorize("hasPermission('Todo', 'add')")@Transactional@Overridepublic Todo add(TodoDTO added) {Todo model = Todo.getBuilder(added.getTitle()).description(added.getDescription()).build();Todo persisted = repository.save(model);indexService.addToIndex(persisted);return persisted;}@PreAuthorize("hasPermission('Todo', 'delete')")@Transactional(rollbackFor = {TodoNotFoundException.class})@Overridepublic Todo deleteById(Long id) throws TodoNotFoundException {Todo deleted = findById(id);repository.delete(deleted);indexService.deleteFromIndex(id);return deleted;}@PreAuthorize("hasPermission('Todo', 'update')")@Transactional(rollbackFor = {TodoNotFoundException.class})@Overridepublic Todo update(TodoDTO updated) throws TodoNotFoundException {Todo model = findById(updated.getId());model.update(updated.getDescription(), updated.getTitle());indexService.addToIndex(model);return model;}
}
摘要
我们已经成功创建了一个应用程序,该应用程序将文档添加到Solr索引并从中删除文档。 这篇博客文章告诉我们以下内容:
- 我们了解了如何创建文档类。
- 我们了解到可以通过扩展SolrCrudRepository接口来创建Spring Data Solr存储库。
- 我们了解到,Spring Data Solr默认情况下假设文档的id字段的名称为'id'。 但是,我们可以通过使用@Id注释对id字段进行注释来覆盖此设置。
- 我们了解到,目前Spring Data Solr(版本1.0.0.RC1)期望文档的ID为String 。
- 我们了解了如何向Solr索引添加文档以及从中删除文档。
- 我们了解到,Spring Data Solr存储库可以参与Spring托管的事务。
我的Spring Data Solr教程的下一部分描述了如何使用查询方法从Solr索引中搜索信息 。
PS此博客条目的示例应用程序可从Github获得 。
翻译自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-crud-almost.html
solr crud
solr crud_Spring Data Solr教程:CRUD(差不多)相关推荐
- Spring Data Solr教程:CRUD(差不多)
在我的Spring Data Solr教程的上一部分中,我们学习了如何配置Spring Data Solr. 现在该迈出一步,了解我们如何管理Solr实例中存储的信息. 此博客文章描述了我们如何向So ...
- Spring Data Solr教程:将自定义方法添加到单个存储库
我的Spring Data Solr教程的前一部分教我们如何使用查询方法创建静态查询. 自然而然的下一步将是描述如何使用Spring Data Solr创建动态查询. 但是,在继续讨论该主题之前,我们 ...
- Spring Data Solr教程:查询方法
我们已经了解了如何配置Spring Data Solr. 我们还学习了如何向Solr索引添加新文档,如何更新现有文档的信息以及从Solr索引删除文档. 现在是时候继续前进,学习如何使用Spring D ...
- Spring Data Solr教程:动态查询
Solr通常被称为搜索服务器,我们可以在实现全文搜索功能时使用它. 但是,当我们实现从搜索表单获取其输入的搜索功能时,利用Solr的性能通常是明智的. 在这种情况下,执行的搜索查询取决于收到的输入. ...
- Spring Data Solr教程:排序
当我们实现单词搜索功能时,我们通常希望通过使用每个搜索结果的相关性以降序对搜索结果进行排序. 这也是Solr的默认行为. 但是,在某些情况下,有必要手动指定排序顺序. 一种此类情况是"常规& ...
- Spring Data Solr教程:分页
在我的Spring Data Solr教程的较早部分中,我们实现了一个简单的搜索功能,该功能用于搜索待办事项的信息. 我们搜索功能的当前实现将所有搜索结果显示在一个页面中. 对于大多数现实生活中的应用 ...
- Spring Data Solr教程:向所有存储库添加自定义方法
如果我们在现实生活中的软件项目中使用Spring Data Solr,很可能我们迟早会遇到一个要求,该要求指出我们的应用程序必须能够与本地Solr服务器和SolrCloud进行通信 . 目前,满足此要 ...
- Spring Data Solr教程:配置
在我的Spring Data Solr教程的上一部分中,我们了解到Solr提供了一个类似REST的HTTP API,该API可用于向Solr索引添加信息并针对索引数据执行查询. 问题在于,在开发环境中 ...
- java 整合solr_SpringBoot整合Spring Data Solr
此文不讲solr相关,只讲整合,内容清单如下 1. maven依赖坐标 2. application.properties配置 3. Java Config配置 1. maven坐标 org.spri ...
最新文章
- 【maven】初识maven
- nginx 启动/停止/重启 BAT
- dedecms 页面无刷新调取
- React with Webpack - 2: css 处理
- hihocoder编程练习赛91:相邻字符串
- uiscrollview 图片放大缩小
- roller for little vGL
- 附下载,《爱分析·中国BI商业智能行业报告》
- java从文本中提取姓名、身份证、电话、地址
- ROS基础(三)——订阅者Subscriber编程实现
- 背景运动补偿具体思路
- 利用DFS解决太平洋大西洋水流问题
- app测试-monkey
- 基于ASP的反垃圾邮件管理系统的设计与实现
- js计算距离特定日期多少周多少天
- c语言expand函数,编纂expand(s1,s2)
- 基于Docker部署Mysql主从复制-实战详解篇
- 计算机专业英语博士就业情况,计算机专业博士期刊文章参考文献 计算机专业博士英语参考文献哪里找...
- 华为云:推动从业务上云到云上创新的跨越
- 获取手机宽度高度dpr的方法
热门文章
- SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载
- Java 内存泄露以及避免方法
- Java魔法堂:URI、URL(含URL Protocol Handler)和URN
- Hibernate: You have an error in your SQL syntax; check the manual that corresponds to your MySQL
- 常用数据库连接串与驱动总结
- 第三章选择结构(一)
- 图的深度优先遍历+图解
- RecyclerView多布局的简单使用
- update字段变更SpringBoot @JsonProperty的使用属性的名称序列化为另外一个名称
- springboot接收浏览器发送delete请求( method not allowed 405解决方法)