Spring Data MongoDB - Beispiel für die Auto Sequence ID

Spring Data MongoDB - Beispiel für die automatische Sequenz-ID

In diesem Tutorial zeigen wir Ihnen, wie Sie eine automatisch inkrementierende Sequenz-ID in der MongoDB + Spring Data-Umgebung generieren.

In diesem Projekt verwendete Tools:

  1. Spring Data MongoDB 1.2.1.RELEASE

  2. MongoDB 2.4.5

  3. Eclipse 4.2

  4. Maven 3

Wenn am Ende dieses Lernprogramms der Sammlungsname "hosting" gespeichert ist, wird eine neue ID für die automatische Inkrementierungssequenz zugewiesen. Unten sehen Sie das Java-Code-Snippet, um die Sequenz-ID zu generieren.

  public long getNextSequenceId(String key) {

    Query query = new Query(Criteria.where("_id").is(key));

        Update update = new Update();
    update.inc("seq", 1);

    FindAndModifyOptions options = new FindAndModifyOptions();
    options.returnNew(true);

    SequenceId seqId =
            mongoOperation.findAndModify(query, update, options, SequenceId.class);

    return seqId.getSeq();

  }

1. Projektstruktur

Überprüfen Sie die Projektverzeichnisstruktur, ein Standard-Maven-Projekt.

springdata-auto-sequence-id

2. Maven Pom

Bei Interesse an den Projektabhängigkeiten.

pom.xml


    
        1.6
        3.2.2.RELEASE
        2.11.1
        1.2.1.RELEASE
    

    

        
        
            org.springframework
            spring-core
            ${spring.version}
        

        
        
            cglib
            cglib
            2.2.2
        

        
        
            org.springframework.data
            spring-data-mongodb
            ${springdata.version}
        

        
        
            org.mongodb
            mongo-java-driver
            ${mongojavadriver.version}
        

    
    
        SpringData
        
          
            org.apache.maven.plugins
            maven-compiler-plugin
            2.3.2
            
                ${jdk.version}
                ${jdk.version}
            
          
        
    

3. Sequenzerfassung

Wir erstellen einen Sammlungsnamen "sequence", um die Sequenz-ID für die automatische Erhöhung zu speichern. Beziehen Sie sich aufSequenceDaoImpl.java unten, es zeigt Ihnen den Code zum Generieren der Sequenz-ID.

Note
Erstellen Sie zuerst die Sequenzsequenz in Ihrer MongoDB!

    db.sequence.insert({_id: "hosting",seq: 0})

SequenceId.java

package com.example.seq.model;

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

@Document(collection = "sequence")
public class SequenceId {

    @Id
    private String id;

    private long seq;

    //get, set, toString...
}

SequenceDao.java

package com.example.seq.dao;

import com.example.seq.exception.SequenceException;

public interface SequenceDao {

    long getNextSequenceId(String key) throws SequenceException;

}

SequenceDaoImpl.java

package com.example.seq.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;

import com.example.seq.exception.SequenceException;
import com.example.seq.model.SequenceId;

@Repository
public class SequenceDaoImpl implements SequenceDao {

    @Autowired
    private MongoOperations mongoOperation;

    @Override
    public long getNextSequenceId(String key) throws SequenceException {

      //get sequence id
      Query query = new Query(Criteria.where("_id").is(key));

      //increase sequence id by 1
      Update update = new Update();
      update.inc("seq", 1);

      //return new increased id
      FindAndModifyOptions options = new FindAndModifyOptions();
      options.returnNew(true);

      //this is the magic happened.
      SequenceId seqId =
            mongoOperation.findAndModify(query, update, options, SequenceId.class);

      //if no id, throws SequenceException
          //optional, just a way to tell user when the sequence id is failed to generate.
      if (seqId == null) {
        throw new SequenceException("Unable to get sequence id for key : " + key);
      }

      return seqId.getSeq();

    }

}

SequenceException.java

package com.example.seq.exception;

public class SequenceException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private String errCode;
    private String errMsg;

    //get, set...
    public SequenceException(String errMsg) {
        this.errMsg = errMsg;
    }

}

4. Holen Sie sich die Sequenz-ID

Verwenden SiesequenceDao.getNextSequenceId("key"), um die Sequenz-ID abzurufen.

HostingBo.java

package com.example.hosting.bo;

import com.example.seq.exception.SequenceException;

public interface HostingBo {

    void save(String name) throws SequenceException;

}

HostingBoImpl.java

package com.example.hosting.bo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.hosting.dao.HostingDao;
import com.example.hosting.model.Hosting;
import com.example.seq.dao.SequenceDao;
import com.example.seq.exception.SequenceException;

@Service
public class HostingBoImpl implements HostingBo {

    private static final String HOSTING_SEQ_KEY = "hosting";

    @Autowired
    private SequenceDao sequenceDao;

    @Autowired
    private HostingDao hostingDao;

    @Override
    public void save(String name) throws SequenceException {

        Hosting hosting = new Hosting();

        hosting.setId(sequenceDao.getNextSequenceId(HOSTING_SEQ_KEY));
        hosting.setName(name);
        hostingDao.save(hosting);

        System.out.println(hosting);

    }

}

5. Testen

Führen Sie einen einfachen Test durch.

package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.example.config.AppConfig;
import com.example.hosting.bo.HostingBo;
import com.example.seq.exception.SequenceException;

public class App {

  public static void main(String[] args) {

    ApplicationContext ctx =
            new AnnotationConfigApplicationContext(AppConfig.class);
    HostingBo hostingBo = (HostingBo) ctx.getBean("hostingBoImpl");

    try {

        hostingBo.save("cloud.google.com");
        hostingBo.save("heroku.com");
        hostingBo.save("cloudbees.com");

    } catch (SequenceException e) {
        System.out.println(e.getErrMsg());
    }

  }
}

Ausgabe - Java-Konsole

Hosting [id=1, name=cloud.google.com]
Hosting [id=2, name=heroku.com]
Hosting [id=3, name=cloudbees.com]

MongoDB-Konsole.

>mongo

> db.sequence.find()
{ "_id" : "hosting", "seq" : 3 }

> db.hosting.find()
{ "_id" : NumberLong(1), "_class" : "com.example.hosting.model.Hosting", "name" : "cloud.google.com" }
{ "_id" : NumberLong(2), "_class" : "com.example.hosting.model.Hosting", "name" : "heroku.com" }
{ "_id" : NumberLong(3), "_class" : "com.example.hosting.model.Hosting", "name" : "cloudbees.com" }
>

6. FAQs

  1. SequenceException - Sequenz-ID für Schlüssel: Hosting?
    kann nicht abgerufen werden

  2. Denken Sie daran, die "Sequenz" -Sammlung zu erstellen!

    db.sequence.insert({_id: "hosting",seq: 0})

Quellcode herunterladen

Herunterladen -SpringData-Auto-Sequence-Example.zip (24 KB)