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:
-
Spring Data MongoDB 1.2.1.RELEASE
-
MongoDB 2.4.5
-
Eclipse 4.2
-
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.
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}
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
-
SequenceException - Sequenz-ID für Schlüssel: Hosting?
kann nicht abgerufen werden -
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)