복붙노트

[MONGODB] 우리는 봄 부트를 사용하여 MongoDB를위한 자동 생성 된 필드를 만들 수있는 방법

MONGODB

우리는 봄 부트를 사용하여 MongoDB를위한 자동 생성 된 필드를 만들 수있는 방법

좀 code.I가에 대한 Autogenerated.Any 솔루션으로 BaseQuestion 클래스에 questionId 필드를 만들고 싶어 쓰기? 우리는이 필드가 자동으로 생성 여기 보여 어떻게 @GeneratedValue annotation.So을 사용할 수 없습니다 JPA jar.so 난을 사용하고 있지 않다. 코드는 다음과 같습니다.

pom.hml

    <?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);

}

해결법

  1. ==============================

    1.MongoDB의 모든 정교한 ObjectId가 생성 기능과 함께,하지만 종종 당신은 관계형 데이터베이스에서 배를 뛰어, 당신은 여전히 ​​읽기 쉬운이 / 자동으로 새 레코드가 삽입 될 때마다 증가 숫자 식별자 필드를 전달합니다.

    MongoDB의 모든 정교한 ObjectId가 생성 기능과 함께,하지만 종종 당신은 관계형 데이터베이스에서 배를 뛰어, 당신은 여전히 ​​읽기 쉬운이 / 자동으로 새 레코드가 삽입 될 때마다 증가 숫자 식별자 필드를 전달합니다.

    MongoDB의 튜토리얼에서 한 깔끔한 제안은 해당 ID로 '카운터 이름', 그리고 마지막으로 사용한 번호를 저장하는 '서열'필드 카운터 수집을 사용하는 것입니다.

    봄 데이터 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
    }
    

    (봄 MongoDB를 저장소 지원의 도움으로) 새 항목을 삽입 할 때 당신이 그것을 저장하기 전에 그런 다음, 그냥이 같은 id 필드를 설정

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

    이 방법이 마음에 들지 않으면 당신은 같은 위의 방법을 사용하여 자동화 된 값을 생성 MongoDBEvents를 사용 onBeforeConvert를 사용해야합니다.

    findAndModify ()는 스레드 안전 원자 방법으로도 접근은 상기 스레드

  2. from https://stackoverflow.com/questions/36448921/how-can-we-create-auto-generated-field-for-mongodb-using-spring-boot by cc-by-sa and MIT license