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 */ /* [ ... ] */ } }