programing

스프링 부트를 사용하여 mongodb에 대한 자동 생성 필드를 생성하려면 어떻게 해야 합니까?

megabox 2023. 6. 23. 21:51
반응형

스프링 부트를 사용하여 mongodb에 대한 자동 생성 필드를 생성하려면 어떻게 해야 합니까?

코드를 작성합니다.questionId 필드를 만들고 싶습니다.BaseQuestion자동 생성된 클래스입니다.그것에 대한 해결책은 없습니까?jpa jar.so 을 사용하지 않습니다. 사용할 수 없습니다.@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>

기본 질문.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;
    }
}

감사 프로젝트 리포지토리.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 튜토리얼의 한 가지 깔끔한 제안은 '카운터 이름'을 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 Repository 지원의 도움을 받아) 저장하기 전에 id 필드를 이렇게 설정하면 됩니다.

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

baseQuestionRepository.save(baseQuestion);

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

또한 위의 접근 방식은 findAndModify()가 스레드 세이프 아토믹 메서드이므로 스레드 세이프입니다.

기본 키에 문자열을 사용하는 것이 좋습니다.이 경우 문자열이 자동으로 생성되므로 아무것도 구성하지 않습니다.

언급URL : https://stackoverflow.com/questions/36448921/how-can-we-create-auto-generated-field-for-mongodb-using-spring-boot

반응형