Low Level Api ではじめてputしてみた記録

ちょっと個人的にGAEで作りたいアプリがあります。ならslim3だろうと。

それでslim3はJDOからLow Level ApiベースのDataStore実装になったらしいのですが、最近全然触れていないので、Low Level Apiをとりあえず書いて試してみた。slim3demoかなんかで勉強するほうが早いのかも知れないけれど、とりあえずね。

前回参加させていただいたajn2でid:shin1oさんが発表してくださったこちらの資料を参考にさせていただきました。ほぼ丸ごと書いただけで動きました。すばらしいですね。ありがとうございます。

        @Test
	public void testPutData() throws EntityNotFoundException {
		Entity favorite = new Entity("myfavorite");
		favorite.setProperty("name", "kijitoraneko");
		DatastoreService service = DatastoreServiceFactory.getDatastoreService();
		Key favoriteKey = service.put(favorite);
		List<Entity> movies = new ArrayList<Entity>();
		Entity movie1 = new Entity("movie", favoriteKey);
		movie1.setProperty("name", "tokyostory");
		movie1.setProperty("score", "100");
		movies.add(movie1);
		Entity movie2 = new Entity("movie", favoriteKey);
		movie2.setProperty("name", "The Sweet Here After");
		movie2.setProperty("score", "90");
		movies.add(movie2);
		service.put(movies);

		Entity director = new Entity("director");
		director.setProperty("name", "yasujirou");
		service.put(director);

		
		//putデータをget
		favorite = service.get(favoriteKey);
		String name = (String) favorite.getProperty("name");
		System.out.println(name);

		Query q = new Query("movie");
		PreparedQuery pq = service.prepare(q);
		List<Entity> resultsMs = pq.asList(FetchOptions.Builder.withOffset(0));
		for (Entity r : resultsMs) {
			name = (String) r.getProperty("name");
			System.out.println(name);
		}
	}


上のコードではEntityクラスのインスタンスを3つ生成してデータストアにputしています。JDOではひとつひとつPOJOクラスを宣言していたわけですが、Low Level ApiではEntityクラスをkind名指定でnewしてあげて、それをデータストアにputするという形のコードになるのですね。

このコードでは3つのうちfavoriteエンティティとmovieエンティティはエンティティグループになっているわけですが、directorエンティティは単独で別のエンティティグループとなります。よってトランザクション処理で3つのエンティティをアトミックに処理しようとしてもこのままではエラーになります。なのでdirectorエンティティ生成時にもmovieエンティティ生成時と同じようにコンストラクタに親のキーを渡してあげることで、エンティティグループとすることが出来るのでそのようにすればよいです。

@Test
	public void xtestPutTx() throws EntityNotFoundException {
		Entity favorite = new Entity("myfavorite");
		favorite.setProperty("name", "kijitoraneko");
		DatastoreService service = DatastoreServiceFactory.getDatastoreService();
		Transaction tx = service.beginTransaction();
		try {
			Key favoriteKey = service.put(tx, favorite);
			List<Entity> movies = new ArrayList<Entity>();
			Entity movie1 = new Entity("movie", favoriteKey);
			movie1.setProperty("name", "tokyostory");
			movie1.setProperty("score", "100");
			movies.add(movie1);
			Entity movie2 = new Entity("movie", favoriteKey);
			movie2.setProperty("name", "The Sweet Here After");
			movie2.setProperty("score", "90");
			movies.add(movie2);
			service.put(tx, movies);

			// これではputでエラーになるよ!
			Entity director = new Entity("director");
			// こうすれば同一エンティティグループになるよ!
			// Entity director = new Entity("director" , favoriteKey);
			
			director.setProperty("name", "yasujirou");
			service.put(director);
			tx.commit();

			
			
			Entity en = service.get(favoriteKey);
			String str = (String) en.getProperty("name");
			System.out.println(str);

			Query q = new Query("movie");
			PreparedQuery pq = service.prepare(q);
			List<Entity> resultsMs = pq.asList(FetchOptions.Builder.withOffset(0));
			for (Entity r : resultsMs) {
				String name = (String) r.getProperty("name");
				System.out.println(name);
			}
		} finally {
			if (tx.isActive()) {
				tx.rollback();
			}
		}
	}

エンティティグループに関しては、JDOで理解しようとするよりこちらで試してみた方がよっぽどイメージしやすいのではないかと思いました。第一歩ということで。忘れないように続けていきたい。