Spring Data Solr教程:CRUD(差不多)

在我的Spring Data Solr教程的上一部分中,我们学习了如何配置Spring Data Solr。 现在该迈出一步,了解我们如何管理Solr实例中存储的信息。 此博客文章描述了我们如何向Solr索引添加新文档,如何更新现有文档的信息以及如何从索引中删除文档。

通过执行以下步骤,我们可以对示例应用程序进行必要的修改:

  1. 创建一个文档类,其中包含存储在Solr索引中的信息。
  2. 为我们的Spring Data Solr存储库创建一个存储库接口。
  3. 创建一个使用创建的存储库的服务。
  4. 使用创建的服务。

以下各节将更详细地描述这些步骤。

注意 :这些博客条目提供了其他信息,可帮助我们理解此博客条目中描述的概念:

  • 使用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索引中。

因此,我们可以按照以下步骤为待办事项创建文档类:

  1. 创建一个名为TodoDocument的类。
  2. id字段添加到TodoDocument类,并与@Field注解注释字段。 用@Id注释对字段进行注释(由于id字段的名称为'id',所以这不是必需的,但我想在此处演示其用法)。
  3. 说明字段添加到TodoDocument类,并与@Field注解注释这一领域。
  4. 标题字段添加到TodoDocument并与@Field注解注释这一领域。
  5. TodoDocument类的字段中创建getter方法。
  6. 创建一个静态内部类,该内部类用于构建新的TodoDocument对象。
  7. 将静态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

我们可以按照以下步骤创建存储库接口:

  1. 创建一个名为TodoDocumentRepository的接口。
  2. 扩展SolrCrudRepository接口,并提供我们的文档类的类型及其ID作为类型参数。

TodoDocumentRepository接口的源代码如下所示:

import org.springframework.data.solr.repository.SolrCrudRepository;public interface TodoDocumentRepository extends SolrCrudRepository<TodoDocument, String> {
}

创建服务

下一步是创建使用已创建的Solr存储库的服务。 我们可以按照以下步骤创建此服务:

  1. 创建服务接口。
  2. 实现创建的接口。

下面将更详细地描述这些步骤。

创建服务接口

我们的服务接口声明了以下两种方法:

  • 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);
}

实施创建的接口

通过执行以下步骤,我们可以实现服务接口:

  1. 创建我们的服务类的框架实现。
  2. 实现用于将文档添加到Solr索引的方法。
  3. 实现用于从Solr索引中删除文档的方法。

下面将更详细地描述这些步骤。

创建服务类的框架实现

通过执行以下步骤,我们可以创建服务接口的框架实现:

  1. 创建一个名为RepositoryTodoIndexService的类,并使用@Service注释对该类进行注释。 该注释将该类标记为服务,并确保在类路径扫描期间将检测到该类。
  2. 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索引的方法:

  1. addToIndex()方法添加到RepositoryTodoIndexService类中,并使用@Transactional注释对该方法进行注释。 这确保了我们的Spring Data Solr存储库将参与Spring托管的事务 。
  2. 通过使用生成器模式创建一个新的TodoDocument对象。 设置创建的文档的id标题描述
  3. 通过调用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索引中删除文档的方法:

  1. deleteFromIndex()方法添加到RepositoryTodoDocumentService类,并使用@Transactional注释对该方法进行注释。 这确保了我们的Spring Data Solr存储库将参与Spring托管的事务 。
  2. 通过调用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类进行以下修改来做到这一点:

  1. TodoIndexService字段添加到RepositoryTodoService类,并使用@Resource注释对该字段进行注释。 该注释指示Spring IoC容器将创建的RepositoryTodoIndexService对象注入到服务的indexService字段中。
  2. 调用在RepositoryTodoService类的add()方法的TodoIndexService接口的addToIndex()方法。
  3. 调用在RepositoryTodoService类的deleteById()方法TodoIndexService接口的deleteFromIndex()方法。
  4. 调用在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获得 。

参考: Spring Data Solr教程: Petri Kainulainen博客上来自我们的JCG合作伙伴 Petri Kainulainen的CRUD(几乎) 。

翻译自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-crud-almost.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数独项目--关键代码展示:

关键代码展示&#xff1a; //判断该数字在当前数独是否符合要求 int judge(int num, int ple){ int x ple / 9; //x表示数字的纵坐标 int y ple % 9; //y表示数字的横坐标 int qulx x / 3; int quey y / 3; //que表示9宫格的区域 for (int i 0; i < 9; i){ if (…

java svn 版本号_eclipse中的Java文件自动根据svn版本号生成注释

经常在java代码中看到以下的注释($Rev: $Date),是不是很酷,怎么生成的呢&#xff1f;/*** A FilterChain is an object provided by the servlet container to the developer* giving a view into the invocation chain of a filtered request for a resource. Filters* use th…

〖Mysql〗-- python操作数据库

【数据库进阶】 python 操作MYSQL数据库主要有两种方式&#xff1a;    使用原生模块&#xff1a;pymysql  ORM框架&#xff1a;SQLAchemy 一、pymysql 1.1下载安装模块 12第一种&#xff1a;cmd下&#xff1a;执行命令下载安装&#xff1a;pip3 install pymysql第二种&…

Sublime Text3—Code Snippets(自定义代码片段)

摘要 程序员总是会不断的重复写一些简单的代码片段&#xff0c;为了提高编码效率&#xff0c;我们可以把经常用到的代码保存起来再调用。 平时用sublime安装各种插件&#xff0c;使用Tab键快速补全&#xff0c;便是snippets&#xff08;可译为代码片段&#xff09;的一种。 …

JBoss AS7 JNDI和EJB 3.1命名更改

由于“功能培训”继续前进&#xff0c;而我们又没有使软件堆栈保持最新&#xff0c;因此我们的团队发现自己处于迁移的不可行位置&#xff1a; JBoss 4.2.3到AS 7.1.x&#xff08;当前为7.1.1&#xff09; EJB 2.1到EJB 3.1 休眠2到休眠3或4 以快速的方式。 我的意思是&…

static关键字(修饰函数、局部变量、全局变量)

在C语言中&#xff0c;static的字面意思很容易把我们导入歧途&#xff0c;其实它的作用有三条。 &#xff08;1&#xff09;先来介绍它的第一条也是最重要的一条&#xff1a;隐藏。 当我们同时编译多个文件时&#xff0c;所有未加static前缀的全局变量和函数都具有全局可见性。…

POJ 2236 - Wireless Network ( 并查集 )

题意 一个计算机网络里的计算机都坏了, 现在有两种操作, “O p”代表修复了p机器, “S p q”代表检查 p, q 两台机器是否连接( 直线距离<d或者中间有距离<d的用来联通的机器 ) 思路 比赛的时候愣是没读清楚题目意思, 还以为是什么搜索, 瞎瘠薄做了个MLE 没料到居然是个并…

Apriori 关联分析算法原理分析与代码实现

转自穆晨 阅读目录 前言关联分析领域的一些概念Apriori算法基本原理频繁项集检索实现思路与实现代码关联规则学习实现思路与实现代码小结回到顶部前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事。 那么&#xff0c;具体是怎么从海量销售信息中…

Spring JpaRepository示例(内存中)

这篇文章描述了一个使用内存中HSQL数据库的简单Spring JpaRepository示例。 该代码示例可从GitHub的Spring-JpaRepository目录中获得。 它基于带有注释的Spring-MVC-示例和此处提供的信息 。 JPA资料库 我们为该示例实现一个虚拟bean&#xff1a; Entity AutoProperty public…

java url接口_javaweb 后台使用url接口

String GET_URL"https://wx.hguard.cn:8075/queryProfiledataAction.action?phone"phone"&beginnum"beginnum"&pagesize"pagesize"&sign"newsignString;try {URL url new URL(GET_URL); // 把字符串转换为URL请求地址…

数据分析 - 残酷的世界

数据分析 - 残酷的世界 可视化作品链接地址&#xff1a;http://reinhardhsu.com/game.html 概要 最近读了比尔盖茨的夏日书单中的荐书《乡下人的悲歌》&#xff0c; 书中描述了贫穷、毒品和一系列陋习&#xff0c;像遗传病一样&#xff0c;困扰着一代又一代的美国底层人民…

burpsuite破解版

来源&#xff1a;http://www.vuln.cn/8847 转载于:https://www.cnblogs.com/shengulong/p/8819072.html

Eclipse Juno上带有GlassFish的JavaEE 7

Java EE 7很热。 前四个JSR最近通过了最终批准选票&#xff0c;与此同时GlassFish 4达到了升级版83。 如果您关注我的博客&#xff0c;那么您将了解NetBeans的大部分工作。 但是我确实认识到&#xff0c;那里还有其他IDE用户&#xff0c;他们也有权试用最新和最出色的企业Java。…

photoshop 切片工具进行切图

1、使用切片工具切图 2、存储为web所用格式 3、选择图片格式 4、只保存切片&#xff08;选择所有用户切片&#xff09; 5、查看&#xff1a;

HubSwitch工作原理,冲突域,以太网帧结构笔记(2017年10月9日 11:15:46)

一、冲突域 网络中发送的主要是应用程序产生的数据。 数据流需要网络设备进行数据转发&#xff0c;任何应用程序在发送数据流之前都要进行数据封装。 比如&#xff1a;SMAC DMAC | SIP DIP | 报头&#xff08;Source Port、Destination Port&#xff09;| QQ的数据载荷&#xf…

在IDEA中实战Git

工作中多人使用版本控制软件协作开发&#xff0c;常见的应用场景归纳如下&#xff1a; 假设小组中有两个人&#xff0c;组长小张&#xff0c;组员小袁 场景一&#xff1a;小张创建项目并提交到远程Git仓库 场景二&#xff1a;小袁从远程Git仓库上获取项目源码 场景三&#xff1…

java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。

求教JAVA里面的错误我都已经看傻了。我思路是想创建个新对象(经理)并打印他的所有属性&#xff0c;外加上work一个干活的属性。自己看了半天改了半天都不行跪求高手给我改改并讲讲。abstractcl...求教JAVA里面的错误我都已经看傻了。我思路是想创建个新对象(经理)并打印他的所有…

从迁移到Java 7的小技巧

经过几年的努力&#xff0c;我们终于开始在软件级别方面将我们的应用程序从黑暗时代中拉出来&#xff0c;其中一个步骤是将我们的Java版本升级到Java7。在大多数情况下&#xff0c;这相当轻松&#xff0c;但是有一些惊喜&#xff1a; 当我们切换到Java 7时&#xff0c;已经运行…

css 宽高自适应的div 元素 如何居中 垂直居中

在我们 编写css 样式的时候经常会遇见一个问题 那就是一个 宽高未知的元素 要让他 垂直居中如何实现这个呢 下面是我常用的两种方法 上代码 下面的是 结构代码 <div class"wrap">//此处为父组件 我们会设置父级的宽高并让其居中 <div class"center&q…

iOS 图文并茂的带你了解深拷贝与浅拷贝

一、概念与总结 1、浅拷贝 浅拷贝就是对内存地址的复制&#xff0c;让目标对象指针和源对象指向同一片内存空间&#xff0c;当内存销毁的时候&#xff0c;指向这片内存的几个指针需要重新定义才可以使用&#xff0c;要不然会成为野指针。 浅拷贝就是拷贝指向原来对象的指针&…