我正在使用hibernate envers审核表的数据并保存在Oracle DB中。我正在使用spring数据弹性搜索通过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行是同时创建的,下一次我修改了这两行并进行了更新,因此冬眠envers会为1次保存创建相同的修订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具有弹簧数据注释id,因此rev被视为弹性搜索中的标识符
答案 0 :(得分:0)
Elasticsearch本身没有组合密钥的概念。 Spring Data Elasticsearch使用带有@Id
注释的元素,并使用其toString()
方法为Elasticsearch创建id条目(并将字段也存储在源代码中)。
因此-无需尝试-您可以将MyEmbeddedId
类用作MyClassAudit
类的字段属性,并用@Id
对其进行注释。但是您必须在您的类中具有此属性,它将不会被合成。
这可能与休眠的注释冲突,但是我认为在存储之间共享一个实体并使用混合注释不是一个好主意。