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

Spring Boot MongoDB中能否使用@GeneratedValue与@Column注解?

Spring Data MongoDB对应JPA注解的使用说明

1. @GeneratedValue的使用替代方案

你用到的@GeneratedValue是JPA规范的注解,仅作用于JPA实现(如Hibernate操作关系型数据库的场景),Spring Data MongoDB默认不识别该注解。

针对ID自动生成的需求,有两种常用实现方式:

  • 如果你可以接受MongoDB默认的主键类型,直接将postId的类型修改为String或者org.bson.types.ObjectId,仅保留@Id注解即可,插入数据时MongoDB会自动生成全局唯一的主键值,无需额外配置。
  • 如果你必须使用Long类型的自增主键,需要自定义自增生成逻辑:
    1. 新建计数器集合存储各文档的主键序列
    2. 实现BeforeConvertCallback接口,在文档插入MongoDB前从计数器集合获取最新的自增ID赋值给主键字段

2. @Column的等价替代注解

JPA的@Column注解同样不适用于Spring Data MongoDB,对应的等价注解是org.springframework.data.mongodb.core.mapping包下的@Field,常用属性对应关系如下:

  • @Field(name = "xxx") 等价于@Column(name = "xxx"),用于指定存储到MongoDB文档中的字段名
  • 如果要实现@Column(updatable = false)的效果,即字段仅在插入时生效、后续更新操作不修改该字段的值,可以使用@ReadOnlyProperty注解标注字段
  • 额外补充:你代码中的createTime、updateTime字段可以直接用@CreatedDate、@LastModifiedDate注解标注,配合启动类添加@EnableMongoAuditing注解,即可实现时间字段的自动填充,无需手动赋值。

修正后的示例代码:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.ReadOnlyProperty;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import lombok.Data;
import java.time.Instant;
import java.util.List;

@Document
@Data
public class ForumPost {
  
  @Id
  // 若使用默认主键类型可改为 ObjectId 或 String 类型,插入时自动生成
  private ObjectId postId;

  @ReadOnlyProperty // 等价于 updatable = false,后续更新不会修改userId
  private Long userId;

  @Field(name = "title") // 存储到MongoDB时字段名为title
  private String postTitle;

  @Field(name = "content")
  private String postContent;

  private List<Comment> comments;

  @CreatedDate
  private Instant createTime;

  @LastModifiedDate
  private Instant updateTime;
  
}

内容的提问来源于stack exchange,提问作者Zhe Sheng Lim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:27:02