Spring Data 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
Spring Data Solr教程:CRUD(差不多)相关推荐
- 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教程:Solr简介
大多数应用程序必须具有某种搜索功能. 问题在于搜索功能通常是巨大的资源消耗,它们可能通过给数据库造成沉重的负担而破坏我们应用程序的性能. 因此,将负载转移到外部搜索服务器是个好主意. 这是我的Spri ...
- Spring Data Solr教程:配置
在我的Spring Data Solr教程的上一部分中,我们了解到Solr提供了一个类似REST的HTTP API,该API可用于向Solr索引添加信息并针对索引数据执行查询. 问题在于,在开发环境中 ...
- solr crud_Spring Data Solr教程:CRUD(差不多)
solr crud 在我的Spring Data Solr教程的上一部分中,我们学习了如何配置Spring Data Solr. 现在该迈出一步,了解我们如何管理Solr实例中存储的信息. 此博客文章 ...
最新文章
- 如何在谷歌云平台上部署可解释性模型
- jsp页面间的传值方法
- VTK:构造图用法实战
- 单步调试学习WordPress PHP文件的加载顺序
- Android动态添加Device Admin权限
- dll放在unity哪个文件夹下_程序丨如何将你的Unity代码整理到一个DLL中?
- 定时重启软件_办公电脑怎样设置定时重启?依靠这款工具即可轻松实现
- celery expires 让celery任务具有时效性
- csv文件的读写--示例
- 如何解决ueditor乱码问题
- n维空间的欧氏距离公式_n维欧氏空间中球的体积公式与表面积公式之间的微分关系(论文资料).pdf...
- WIN10系统进入BIOS的方法(无需开机时按快捷键)
- 华为鲲鹏云服务技术与运用 部分习题
- 挂载NTFS分区的两种方法
- iOS直播APP—原理篇
- 蜕变的过程总是痛苦的
- 前装ADAS单月搭载量创11个月以来新低,“缺芯”背后暗潮涌动
- 在Windows中初次安装VS Code详细过程及初始化
- 华为快应用IDE——让快应用开发更快
- 一款程序员值得拥有的机械键盘:Keychron K3
热门文章
- java 时分秒格式小时8_Java里得到00:00:00格式的时分秒的Timestamp
- jvm的client与server工作模式
- MarkdownPad 汉化破解(含下载地址)
- java 拼图_拼图推迟将Java 9的发布日期推迟到2017年
- java多线程 异常处理_Java8多线程ForkJoinPool:处理异常
- netflix测试能不能看_Netflix监管者测试–引入知事,准官员
- mockito_书评:Mockito Essentials
- 代码jit_但这是不可能的,或者无法发现JIT破坏了您的代码。
- lucene自动补全_使用自动机的Lucene新的邻近查询
- 使用@JsonIdentityInfo的Spring自定义序列化器