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:
Spring Data MongoDB 1.2.1.RELEASE
MongoDB 2.4.5
Eclipse 4.2
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.
2. Maven Pom
Si vous êtes intéressé par les dépendances du projet.
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").