Я использую Hibernate Envers для аудита данных для моих таблиц и сохранения в Oracle DB. Эти данные аудита я читаю и сохраняю в индекс упругого поиска через код Java с помощью упругого поиска данных Spring. У меня есть составной ключ (id и rev), который определяет уникальную строку для сохранения данных, но для упругого поиска я не могу предоставить составной ключ. Он принимает только столбец rev (identifier) и заменяет данные.
Hibernate включает фоновую информацию: rev - это идентификатор по умолчанию, который предоставляет hibernate, и для списка записей, которые были изменены одновременно, он создает тот же идентификатор rev:
Eg: id rev comments
1 1 newly created
2 1 newly created
1 2 modified
2 2 modified
Первые 2 строки создаются одновременно, и в следующий раз я изменил обе строки и обновил их так, чтобы hibernate envers создавал один и тот же идентификатор версии для 1 сохранения.
@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 имеет идентификатор аннотации данных пружины, rev рассматривается как идентификатор в упругом поиске