Spring Data MongoDB - Exemple d’identification automatique de séquence

Spring Data MongoDB - Exemple d'ID de séquence automatique

Dans ce didacticiel, nous allons vous montrer comment générer un identifiant de séquence à incrémentation automatique dans l'environnement MongoDB + Spring Data.

Outils utilisés dans ce projet:

  1. Spring Data MongoDB 1.2.1.RELEASE

  2. MongoDB 2.4.5

  3. Eclipse 4.2

  4. Maven 3

À la fin de ce didacticiel, si le nom de la collection «hosting» est enregistré, un nouvel identifiant de séquence d'incrémentation automatique sera attribué. Ci-dessous, l'extrait de code Java pour générer l'ID de séquence.

  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. Structure du projet

Passez en revue la structure du répertoire du projet, un projet Maven standard.

springdata-auto-sequence-id

2. Maven Pom

Si vous êtes intéressé par les dépendances du projet.

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. Collection de séquences

Nous créons un nom de collection «séquence» pour stocker l'identifiant de séquence d'augmentation automatique. Reportez-vous auxSequenceDaoImpl.java ci-dessous, il vous montre le code pour générer l'ID de séquence.

Note
Créez d'abord la collection «séquence» dans votre 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. Obtenez l'ID de séquence

Pour obtenir l'ID de séquence, utilisesequenceDao.getNextSequenceId("key").

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. Essai

Exécutez un test simple.

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());
    }

  }
}

Sortie - console Java

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

Console MongoDB.

>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 - Impossible d'obtenir l'ID de séquence pour la clé: hébergement?

  2. N'oubliez pas de créer la collection «séquence»!

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

Télécharger le code source

Télécharger -SpringData-Auto-Sequence-Example.zip (24 KB)