使用Spring Data和ElasticSearch时,如何自动生成数字ID?

5

我目前正在将一个使用Spring Data和Hibernate的项目转换到Spring Data和ElasticSearch。

之前,我能够使用注解@GeneratedValue(strategy = GenerationType.IDENTITY)自动生成实体的id。这样,当保存实体时,会为其生成一个id编号。

然而,我似乎找不到ElasticSearch使用的类似注解来达到同样的结果。

使用Hibernate注解的实体:

@Entity
@Table(name = "person")
public class Person {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    }

是否有 ElasticSearch 的 @GeneratedValue 注解的等效物?如果没有,那么在使用 ElasticSearch 时填充 id 字段的最佳方法是什么?


嗨@pike,你找到如何做这个了吗? - vhbazan
看起来目前不支持此功能:https://jira.spring.io/browse/DATAES-42 - Mark B
3个回答

0

我刚遇到了同样的问题,看起来没有这样的注释,但我们可以通过定义自定义的BeforeConvertCallback组件来设置必要的ID。

@Component
public class BookBeforeConvertCallback implements BeforeConvertCallback<Book> {

    @Override
    public Book onBeforeConvert(Book book, IndexCoordinates indexCoordinates) {

        if (book.getId() == null) {
            book.setId(UUIDs.randomBase64UUID());
        }

        return book;
    }
}

参考:https://github.com/spring-projects/spring-data-elasticsearch/issues/616#issuecomment-752866566


-2

我曾经遇到过同样的问题,使用以下代码解决了它:

@Entity
@Table(name = "person")
public class Person {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @GeneratedValue(generator="generator")
    @org.springframework.data.annotation.Id
    private long id;

1
这个答案可能适用于Spring Data JPA,但不适用于Spring Data Elasticsearch,而问题正是关于它的。 - Mark B

-2

2
谢谢您的回答,但我正在寻找一个ElasticSearch注释,它可以作为@GeneratedValue的等效物。您是否在这方面有任何ElasticSearch的经验? - pike
抱歉,我理解您正在使用Hibernate与ElasticSearch。如果您正在使用纯ElasticSearch API,则只需按照此处记录的方式使用POST:https://www.elastic.co/guide/en/elasticsearch/guide/current/index-doc.html - Piotr Wilkin
@PiotrWilkin Hibernate 只能与 SQL 数据库一起使用,无法与 ElasticSearch 一起使用。这个问题是关于 Spring Data Elasticsearch 的,不是关于 Hibernate,也不是关于“纯粹的 Elasticsearch”。 - Mark B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接