【发布时间】:2019-10-04 13:39:25
【问题描述】:
我正在使用休眠环境来审核我的表的数据并保存在 Oracle DB 中。我正在使用 Spring Data 弹性搜索通过 Java 代码读取并保存到弹性搜索索引的审计数据。我有一个复合键(id 和 rev),它定义了一个唯一的行来保存数据,但对于弹性搜索,我无法提供复合键。它只占用 rev(标识符)列并替换数据。
Hibernate 环境背景信息: rev 是 hibernate 提供的默认标识符,对于同时修改的记录列表,它会创建相同的 rev id:
Eg: id rev comments
1 1 newly created
2 1 newly created
1 2 modified
2 2 modified
前 2 行是同时创建的,下一次我修改了这两个行并进行了更新,因此 hibernate envers 为 1 次保存创建了相同的 rev id。
@Entity
@IdClass(MyEmbeddedId.class)
@Document(indexName = "#{@indexName}", type = "my-document", shards = 1, replicas = 0, refreshInterval = "-1")
@Getter @Setter
public class MyClassAudit {
@Id
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@org.springframework.data.annotation.Id --> (this is for elastic search _id)
private Long rev;
}
@Getter @Setter
public class MyEmbeddedId implements Serializable {
private Long id;
private Long rev;
}
Java 代码:
List<MyClass> list = repository.findById(id);
elasticSearchRepository.saveAll(list)
弹性搜索库接口:
public interface MyElasticSearchRepository extends GenericSearchRepository<MyClassAudit, Long> {}
当我将数据保存到弹性搜索时,所有 4 条记录都应按照示例中给出的方式保存,但只保存 2 条记录,如下所示:
_id id rev comments
1 2 1 newly created
2 2 2 modified
这是因为 rev 被视为弹性搜索中的标识符,并且正在更新第二条记录。
如何使弹性搜索考虑复合键来维护唯一记录? PS:_id 是弹性搜索标识符。由于 rev 具有 spring 数据注释 id,因此 rev 被视为弹性搜索中的标识符
【问题讨论】:
标签: elasticsearch spring-data spring-data-elasticsearch composite-key