Java spring 数据 mongodb:UUID 作为 mongodb 中的实体 ID

Java spring data mongodb: UUID as entity ID in mongodb

我正在使用 spring-boot-starter-data-mongodb:

构建 spring 启动应用程序

我的实体看起来像:

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

    @Id
    UUID id;

    String info;
}

和存储库接口:

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

问题是,当我插入具有空 id 字段的节点对象时,应用程序抛出异常并显示以下消息:

Cannot autogenerate id of type java.util.UUID for entity of type model.Node!

我知道开箱即用 spring mongodb 支持自动生成的 String 和 BigInteger id 类型。

所以我想知道是否可以使用 UUID 作为我的 id 字段的类型?我可以为我的实体创建某种类型的自定义 MappingMongoConverter 吗?

您可以通过创建 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 {
    ...
}

希望对您有所帮助。

我会通过实施 onBeforeSave 侦听器或 onBeforeConvert 侦听器来实现此目的,详见 the documentation here.