SpringデータMongoDB – 自動シーケンスIDの例
このチュートリアルでは、MongoDB Spring Data環境で自動インクリメントシーケンスIDを生成する方法を説明します。
このプロジェクトで使用されるツール:
-
SpringデータMongoDB 1.2.1.RELEASE
-
MongoDB 2.4.5
-
Eclipse 4.2
-
Maven 3
このチュートリアルの最後で、コレクション名 “hosting”が保存されると、新しい自動インクリメントシーケンスIDが割り当てられます。以下は、シーケンスIDを生成するためのJavaコードスニペットです。
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.プロジェクトの構成
標準のMavenプロジェクトであるプロジェクトのディレクトリ構造を見直してください。
2. Maven Pom
あなたがプロジェクトの依存関係に興味がある場合。
pom.xml
<project ...> <properties> <jdk.version>1.6</jdk.version> <spring.version>3.2.2.RELEASE</spring.version> <mongojavadriver.version>2.11.1</mongojavadriver.version> <springdata.version>1.2.1.RELEASE</springdata.version> </properties> <dependencies> <!-- Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- need this for @Configuration --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> <!-- Spring Data for MongoDB --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>${springdata.version}</version> </dependency> <!-- Java MongoDB Driver --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>${mongojavadriver.version}</version> </dependency> </dependencies> <build> <finalName>SpringData</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> </configuration> </plugin> </plugins> </build> </project>
3.シーケンスコレクション
自動増加シーケンスIDを格納するコレクション名 “シーケンス”を作成します。以下の `SequenceDaoImpl.java`を参照してください。シーケンスIDを生成するコードが表示されます。
db.sequence.insert({__id: "hosting",seq: 0})
SequenceId.java
package com.mkyong.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.mkyong.seq.dao; import com.mkyong.seq.exception.SequenceException; public interface SequenceDao { long getNextSequenceId(String key) throws SequenceException; }
SequenceDaoImpl.java
package com.mkyong.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.mkyong.seq.exception.SequenceException; import com.mkyong.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.mkyong.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.シーケンスIDを取得する
シーケンスIDを取得するには、 `sequenceDao.getNextSequenceId(” key “)`を使用します。
HostingBo.java
package com.mkyong.hosting.bo; import com.mkyong.seq.exception.SequenceException; public interface HostingBo { void save(String name) throws SequenceException; }
HostingBoImpl.java
package com.mkyong.hosting.bo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.mkyong.hosting.dao.HostingDao; import com.mkyong.hosting.model.Hosting; import com.mkyong.seq.dao.SequenceDao; import com.mkyong.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.テスト
簡単なテストを実行します。
package com.mkyong; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.mkyong.config.AppConfig; import com.mkyong.hosting.bo.HostingBo; import com.mkyong.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()); } } }
出力 – Javaコンソール
Hosting[id=1, name=cloud.google.com]Hosting[id=2, name=heroku.com]Hosting[id=3, name=cloudbees.com].... MongoDBコンソール。
>mongo
db.sequence.find()
{ “__id” : “hosting”, “seq” : 3 }
db.hosting.find()
{ ”
id” : NumberLong(1), ”
class” : “com.mkyong.hosting.model.Hosting”, “name” : “cloud.google.com” }
{ ”
id” : NumberLong(2), ”
class” : “com.mkyong.hosting.model.Hosting”, “name” : “heroku.com” }
{ ”
id” : NumberLong(3), ”
class” : “com.mkyong.hosting.model.Hosting”, “name” : “cloudbees.com” }
=== 6.よくある質問 Q. SequenceException - キーのシーケンスIDを取得できません:ホスティングですか? A. "シーケンス"コレクションを作成することを忘れないでください!
db.sequence.insert({__id: "hosting",seq: 0})
=== ソースコードをダウンロードする ダウンロード:link://wp-content/uploads/2014/03/SpringData-Auto-Sequence-Example.zip[SpringData-Auto-Sequence-Example.zip](24 KB) === 参考文献 . http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/[MongoDB - 自動インクリメントシーケンスフィールドの作成] link://tag/sequence-id/[シーケンスID]link://tag/spring-data/[spring-data]