このチュートリアルでは、MongoDB Spring Data環境で自動インクリメントシーケンスIDを生成する方法を説明します。

このプロジェクトで使用されるツール:

  1. SpringデータMongoDB 1.2.1.RELEASE

  2. MongoDB 2.4.5

  3. Eclipse 4.2

  4. 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プロジェクトであるプロジェクトのディレクトリ構造を見直してください。


springdata-auto-sequence-id、width = 427、height = 592

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]