我写了一些代码.我想让BaseQuestion类中的questionId字段自动生成.有什么解决办法吗?我没有使用jpa jar.所以我不能使用@Generatedvalue注释.所以我们在这里展示这个字段是自动生成的.

pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>audit_project</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

BaseQuestion.java

package model;

import java.util.List;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "basequestion")
public class BaseQuestion {
      @ID
    private String id;
    private int questionId;
    private String responseType;
    private boolean required;
    private boolean active;
    private String questionCode;
    private QuestionText questionText;
    private String category;
    private List<Responses> responses;

    public QuestionText getQuestionText() {
        return questionText;
    }

    public void setQuestionText(QuestionText questionText) {
        this.questionText = questionText;
    }

    public List<Responses> getResponses() {
        return responses;
    }

    public void setResponses(List<Responses> responses) {
        this.responses = responses;
    }

    public int getQuestionId() {
        return questionId;
    }

    public void setQuestionId(int questionId) {
        this.questionId = questionId;
    }

    public String getResponseType() {
        return responseType;
    }

    public void setResponseType(String responseType) {
        this.responseType = responseType;
    }

    public boolean getRequired() {
        return required;
    }

    public void setRequired(boolean required) {
        this.required = required;
    }

    public String getQuestionCode() {
        return questionCode;
    }

    public void setQuestionCode(String questionCode) {
        this.questionCode = questionCode;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}

AuditProjectRepository.java

package repository;

import org.springframework.data.mongodb.repository.MongoRepository;

import model.BaseQuestion;

public interface AuditProjectRepository extends MongoRepository<BaseQuestion, String> {

    public BaseQuestion findByQuestionId(int questionId);

    public BaseQuestion findByQuestionCode(String questionCode);

    public Long deleteByQuestionId(int questionid);

}

推荐答案

MongoDB提供了所有复杂的ObjectId生成功能,但通常情况下,您只是脱离了关系数据库,仍然需要一个易于读取/通信的数字标识符字段,该字段在每次插入新记录时自动递增.

MongoDB tutorial的一个简洁建议是使用计数器集合,其id为"计数器名称",并使用"seq"字段存储最后使用的编号.

在使用Spring Data MongoDB进行开发时,这个巧妙的技巧可以写成一个简单的服务.在这里,我使用集合名称作为计数器名称,因此很容易猜测/记住.

import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import com.model.CustomSequences;


@Service
public class NextSequenceService {
    @Autowired private MongoOperations mongo;

    public int getNextSequence(String seqName)
    {
        CustomSequences counter = mongo.findAndModify(
            query(where("_id").is(seqName)),
            new Update().inc("seq",1),
            options().returnNew(true).upsert(true),
            CustomSequences.class);
        return counter.getSeq();
    }
}

CustomSequences只是一个表示集合的简单类.请注意int数据类型的使用,最多只能使用2^31个条目.

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "customSequences")
public class CustomSequences {
    @Id
    private String id;
    private int seq;

// getters and setters
}

然后,在插入一个新条目时(借助Spring MongoDB存储库支持),只需在保存之前像这样设置id字段

BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */

baseQuestionRepository.save(baseQuestion);

如果您不喜欢这种方式,那么您需要使用MongoDBEvents和onBeforeConvert来使用上述方法生成自动价值.

上述方法也是线程安全的,因为findAndModify()是一种线程安全的原子方法

Mongodb相关问答推荐

映射数组值并查找每个匹配的集合

在Mongoose中对嵌套文档设置时间戳,但不对父文档设置时间戳

在mongo聚合管道的组阶段排除字段,但在最后将其包含在内

执行聚合以消除重复并获得唯一计数

MongoDB 对特定搜索查询的响应时间较长

MongoDb聚合查询问题

如何在MongoDB中搜索有序子集的方法?

Mongodb,在一个查询中用正则表达式更新部分字符串

对 MongoDB 集合中的对象数组进行排序

mongodb - 查找包含至少 3 个填充数组的记录

如何在mongoDB中按嵌套文档分组( group by )

Meteor 和 Fibers/bindEnvironment() 是怎么回事?

在 MongoDB 中创建简短、唯一的对象 ID

Node.js 和 Passport 对象没有方法 validPassword

使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

mongodb启动错误

如何在 Meteor 应用程序之间共享 MongoDB 集合?

MongoDB聚合框架的索引优化

为什么 Mongo 提示会使查询运行速度提高 10 倍?

mongoose查询返回 null