java - 保存后Spring数据solr不返回自动生成的ID
问题描述
我只是尝试使用弹簧数据将实体保存到 solr 中并获取其自动生成的 ID。我看到生成了 id 但没有返回给我。代码很简单
实体:
@SolrDocument(solrCoreName = "bank")
@Canonical
class Shop {
@Id
@Field
String id
@Field
String name
}
存储库:
@Repository
interface ShopRepository extends SolrCrudRepository<Shop, String>{
}
处理程序:
@Autowired
ShopRepository repository
void save() {
Shop shop = new Shop()
shop.name = 'shop1'
log.info("before {}", shop)
Shop savedShop = repository.save(shop)
log.info("after {}", savedShop)
}
依赖项:
dependencies {
compile lib.groovy_all
compile 'org.springframework.boot:spring-boot-starter-data-solr:1.5.10.RELEASE'
}
结果是:
before com.entity.Shop(null, shop1)
after com.entity.Shop(null, shop1)
但是通过 solr 的管理控制台,我看到生成的 id:
{ "responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"*:*",
"_":"1527472154657"}}, "response":{"numFound":3,"start":0,"docs":[
{
"name":["shop1"],
"id":"4db1eb1d-718b-4a38-b960-6d52f9b6240c",
"_version_":1601670593291223040,
"name_str":["shop1"]},
{
"name":["shop1"],
"id":"6ad52214-0f23-498d-82b8-82f360ef22f1",
"_version_":1601670855078707200,
"name_str":["shop1"]},
{
"name":["shop1"],
"id":"b45b5773-f2b9-4474-b177-92c98810978b",
"_version_":1601670887722975232,
"name_str":["shop1"]}] }}
并且 repository.findAll() 也返回带有映射 id 的正确结果。它是功能还是错误?
解决方案
流程按预期工作(返回的对象中没有可用的 ID):
在保存操作期间
- 原始对象转换为可以被 Solr 消化的东西(id 为空)
- 更新请求(带有空 id 的对象)被发送到 Solr
- Solr 处理“创建”并(内部)生成 ID
- Solr 响应是 OK/KO(几乎没有其他数据......但这里没有 ID)
所以...最终对象与原始对象完全相同(id为空)。
一个快速的“解决方法”可以实现为:
@Repository
public interface PlaceRepo extends SolrCrudRepository<PlaceModel, String> {
default PlaceModel create(PlaceModel model, Duration commit) {
model.setId(IDGenerator.generateID());
return this.save(model, commit);
}
default PlaceModel create(PlaceModel model) {
return this.create(model, Duration.ZERO);
}
}
您正在将 ID 生成逻辑移至 Java 层。Id 可以生成为
public static String generateID() {
return UUID.randomUUID().toString();
}
推荐阅读
- aws-lambda - 如何在 org.kie.internal.io.ResourceFactory.newFileResource 修复“java.lang.NullPointerException”
- javascript - 列表未在 v-for 指令中呈现
- dart - 如何获取用户输入作为另一个屏幕的 URL?
- ios - iOS:根据分发证书生成苹果开发者证书
- xamarin.forms - 如何在 xamarin 表单中使用 kindle uri 方案?
- python - POST 请求不发送会话 cookie
- sql - sql server bcp export binary in csv,如何用''替换它?
- amazon-web-services - 如何在Route53中同一域下的不同EC2实例中配置两个不同的应用程序?
- c# - 如何退出 Mono 服务?
- reactjs - React styled-components 导航栏样式不起作用