Сохранение данных составного ключа в эластичный поисковый документ - PullRequest
0 голосов
/ 04 октября 2019

Я использую 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 рассматривается как идентификатор в упругом поиске

1 Ответ

0 голосов
/ 07 октября 2019

Сам Elasticsearch не имеет понятия составного ключа. Spring Data Elasticsearch берет аннотированный элемент @Id и использует его метод toString() для создания записи идентификатора для Elasticsearch (и сохраняет поле также в источнике).

Так что - без еще не пробовал -Вы можете использовать свой класс MyEmbeddedId в качестве свойства поля вашего класса MyClassAudit и пометить его @Id. Но у вас должно быть это свойство в вашем классе, оно не будет синтезировано.

Это, вероятно, будет конфликтовать с аннотациями для спящего режима, но я не думаю, что будет хорошей идеей разделять одну сущность между хранилищами ииспользуя смешанные аннотации.

...