Данные весны Java mongodb: UUID как идентификатор объекта в mongodb - PullRequest
0 голосов
/ 28 февраля 2019

Я создаю приложение весенней загрузки с spring-boot-starter-data-mongodb:

У меня есть etity, который выглядит следующим образом:

@Document(collection = "nodes")
@Data
@Builder
public class Node {

    @Id
    UUID id;

    String info;
}

и интерфейс репозитория:

public interface NodesRepository extends MongoRepository<Node, UUID> {
}

Проблема в том, что при вставке объекта Node с пустым полем id приложение выдает исключение со следующим сообщением:

Невозможно автоматически сгенерировать идентификатор типа java.util.UUID длясущность типа model.Node!

Я знаю, что стандартная пружина mongodb поддерживает идентификаторы String и BigInteger для автогенерации.

Итак, я хочу знать, возможно ли использовать UUID в качестве типа для моего поля id или нет?Могу ли я создать какой-нибудь тип MappingMongoConverter для моей сущности?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я бы сделал это путем реализации onBeforeSave прослушивателя или, возможно, onBeforeConvert прослушивателя, как описано в документации здесь .

0 голосов
/ 28 февраля 2019

Вы можете решить эту проблему, создав CustomRepository

@NoRepositoryBean
public interface CustomMongoRepository<T extends BaseEntity>
    extends MongoRepository<T, Long> {
}

public class CustomMongoRepositoryImpl<T extends BaseEntity>
        extends SimpleMongoRepository<T, Long> implements CustomMongoRepository<T> {

    CustomMongoRepositoryImpl(
        MongoEntityInformation<T, Long> entityInformation,
        MongoOperations mongoOperations) {

        super(entityInformation, mongoOperations);
    }

    @Override
    public <S extends T> S insert(S entity) {
        generateId(entity);
        return super.insert(entity);
    }

    @Override
    public <S extends T> List<S> insert(Iterable<S> entities) { ... }

    @Override
    public <S extends T> S save(S entity) { ... }

    @Override
    public <S extends T> List<S> save(Iterable<S> entities) { ... }

    protected <S extends T> void generateId(S entity) { ... }

}

@SpringBootApplication
@EnableMongoRepositories(repositoryBaseClass = CustomMongoRepositoryImpl.class)
public class Application {
    ...
}

Надеюсь, это полезно.

...