Slim3のGlobalTransactionをよくわからないけど使ってみた

親子関係のある複数のモデルをLocal Transactionを使って保存する場合、Keyによって関連を定義しないと処理を行えないらしいです。
トランザクション - Google App Engine — Google Developers


Slim3にはGlobalTransactionがあるのでEntityGroupを気にしなくても整合性を保って更新できるって事なので使ってみました

環境

  • Slim3 version 1.0.12
  • App Engine SDK 1.5.2

汎用的に処理を行うため、Handlerクラスを定義してます。

  • PersistWithTx: Global Transactionで永続化
  • DataHandler: 永続化のための処理
  • Person: Personモデル(親)
  • Address: Addressモデル(子)
  • PersonService: サービスクラス

ソース

Global Transactionを使って永続化を行う処理

モデル処理の実行サンプル

新規登録のテストケース

こんな感じ?

package jp.rh7.service;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
/* [ ... ]: その他パッケージ */

public class PersonServiceTest extends AppEngineTestCase {
/* [ ... ] */
    @Test
    public void createTerm() throws Exception {
        // Matchers
        Person chkPersonModel = new Person();
        chkPersonModel.setName("山田 太郎");
        Address addrModel = new Address();
        addrModel.setZipCode("123-4567");
        addrModel.setAddress("東京都なんとか区なんとかかんとか1-2");

        /* Excecute */
        service.createTerm(chkPersonModel, addrModel);
        List<Person> storedPersonList = QueryManager.getPersonList();
        /* result */
        assertThat(storedPersonList, is(notNullValue()));
        assertThat(storedPersonList.size(), is(1));
        Person storedPersonModel = storedPersonList.get(0);
        assertThat(storedPersonModel, is(notNullValue()));
        List<Address> storedAddrList =
            storedPersonModel.getAddressListRef().getModelList();
        assertThat(storedAddrList, is(notNullValue()));
        assertThat(storedAddrList.size(), is(1));
        Address storedAddrModel = storedAddrList.get(0);
        assertThat(storedAddrModel, is(notNullValue()));
        /* Check save values */
/* [ ... ] */
    }
}