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