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

Ser*_*aev 10 java spring mongodb spring-data spring-data-mongodb

我正在使用 spring-boot-starter-data-mongodb 构建 spring boot 应用程序:

我有一个看起来像的实体:

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

    @Id
    UUID id;

    String info;
}
Run Code Online (Sandbox Code Playgroud)

和存储库界面:

public interface NodesRepository extends MongoRepository<Node, UUID> {
}
Run Code Online (Sandbox Code Playgroud)

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

无法为 model.Node 类型的实体自动生成 java.util.UUID 类型的 id!

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

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

小智 6

您可以通过创建 CustomRepository 来解决这个问题

@NoRepositoryBean
public interface CustomMongoRepository<T extends BaseEntity>
    extends MongoRepository<T, Long> {
}
Run Code Online (Sandbox Code Playgroud)
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) { ... }

}
Run Code Online (Sandbox Code Playgroud)
@SpringBootApplication
@EnableMongoRepositories(repositoryBaseClass = CustomMongoRepositoryImpl.class)
public class Application {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我希望这是有帮助的。