You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PanacheMongoEntityBase自定义MongoDB自增ID失效问题

问题原因分析

你用的@SequenceGenerator、@GeneratedValue是JPA规范的注解,仅适用于关系型数据库,MongoDB作为文档数据库并不支持这套机制,所以Panache不会处理这些注解,依然会默认生成ObjectId类型的_id字段,导致你的自增ID逻辑失效。

正确实现方式

要在Quarkus Panache + MongoDB中实现自增ID,需要通过维护独立序列集合的方式,利用MongoDB的原子操作来保证并发场景下的ID唯一性,具体步骤如下:

1. 创建序列实体类

新建一个用于存储自增序列的集合,记录每个业务类型的当前序列值:

@MongoEntity(collection = "sequences")
public class Sequence extends PanacheMongoEntityBase {
    @BsonId
    public String name; // 序列标识,比如"order_reference"
    public int value; // 当前序列数值
}

2. 修改订单实体类

移除无用的JPA注解,保留@BsonId标记自增字段为MongoDB的主键,同时添加自定义的持久化方法:

@MongoEntity(collection = "order")
public class Order extends PanacheMongoEntityBase {
    @BsonId
    public Integer referenceNumber;
    // 其他业务字段...

    // 自定义带自增ID的持久化方法
    public void persistWithAutoIncrement() {
        // 原子性获取并递增序列值
        Sequence sequence = Sequence.mongoCollection().findOneAndUpdate(
            Filters.eq("name", "order_reference"),
            Updates.inc("value", 1),
            new FindOneAndUpdateOptions()
                .upsert(true) // 不存在则创建新序列
                .returnDocument(ReturnDocument.AFTER) // 返回更新后的序列
        );
        this.referenceNumber = sequence.value;
        this.persist();
    }
}

3. 初始化初始序列值

在应用启动时初始化订单序列的初始值(从9999开始,第一次递增后就是10000):

@ApplicationScoped
@Startup
public class SequenceInitializer {
    void initOrderSequence() {
        if (Sequence.find("name", "order_reference").count() == 0) {
            Sequence orderSeq = new Sequence();
            orderSeq.name = "order_reference";
            orderSeq.value = 9999;
            orderSeq.persist();
        }
    }
}

4. 使用方式

在业务代码中调用自定义的持久化方法即可:

Order newOrder = new Order();
// 设置其他字段
newOrder.persistWithAutoIncrement();
关键注意点
  • 必须用@BsonId标记自增字段,替代JPA的@Id,这样MongoDB才会将该字段作为主键,不再生成默认的ObjectId。
  • 使用findOneAndUpdate保证序列递增的原子性,避免并发场景下出现重复ID。

内容的提问来源于stack exchange,提问作者Tobias Ingebrigt Ørstad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:45:10