最近はlow level Apiが隆盛しているのでしょうか


以下、前に自分で確認したコードみたいなんだ。GAEのJDOって消えていったりするんでしょうかね? んなこたない。

package jp.co.example.kijitoraneko.test;

import java.util.Arrays;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;

import jp.co.example.kijitoraneko.PMF;
import jp.co.example.kijitoraneko.model.Album;
import jp.co.example.kijitoraneko.model.Book;
import jp.co.example.kijitoraneko.model.Category;
import jp.co.example.kijitoraneko.model.Movie;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

/**
 * 
 * 基本的にDataStoreでは、
 * エンティティグループや
 * トランザクションはないにこしたことはないっぽい。
 * エンティティグループが同じエンティティは、スケールしないようだし。
 *
 */
public class EntityGroupTest extends LocalBaseTestCase {
    /**
	 * 
	 * 非所有でエンティティグループ実現
	 *
	 * 所有関係を持たないで、Movieに@Extensionタグで親のキーを持つと、
	 * Movieをpersistしてcommitすれば、親キー情報を保持したkeyが生成される。
	 * エンティティグループになるので、同一トランザクションでの処理が可能。
	 *
	 */
	public void testInsertNotOwned() {

		Category ca = new Category();
		Key categoryKey = KeyFactory.createKey(Category.class.getSimpleName(),
				"abcdefghijklmn");
		ca.setKey(KeyFactory.keyToString(categoryKey));
		ca.setCategoryname("Movie");
		Movie movie1 = new Movie();
		Movie movie2 = new Movie();
		movie1.setCakey(ca.getKey());
		movie2.setCakey(ca.getKey());
		movie1.setMoviename("tokyostory");
		movie2.setMoviename("The Sweet Hereafter");

		PersistenceManager pm = PMF.get().getPersistenceManager();
		Transaction tx = pm.currentTransaction();

		tx.begin();
		Query q = null;
		try {
			pm.makePersistent(ca);
			pm.makePersistent(movie1);
			pm.makePersistent(movie2);
			try {
				tx.commit();
			} catch (Exception e) {
				e.printStackTrace();
			}
			q = pm.newQuery("select from " + Movie.class.getName());
			q.setFilter("moviename == movienameParam");
			q.declareParameters("String movienameParam");
			List<Movie> ms = (List<Movie>) q.execute("tokyostory");

			assertEquals(1, ms.size());
			assertEquals("tokyostory", ms.get(0).getMoviename());

		} finally {
			pm.close();
		}
	}


	/**
	 * 所有(自動的にエンティティグループ)の1:1関連
	 *
	 * Albumを二つ作ったらpersistできない。(それは1:多になるのでね)
	 */
	public void testInsertOnetoOneOwned() {
		Category ca = new Category();
		Key categoryKey = KeyFactory.createKey(Category.class.getSimpleName(),
				"abcdefghijklmn");
		ca.setKey(KeyFactory.keyToString(categoryKey));
		ca.setCategoryname("CDアルバム");
		Album album1 = new Album();
		// Album album2 = new Album();

		album1.setCategory(ca);
		// album2.setCategory(ca);
		album1.setAlbumname("jeremy");
		// album2.setAlbumname("Second coming");

		PersistenceManager pm = PMF.get().getPersistenceManager();
		Transaction tx = pm.currentTransaction();

		tx.begin();
		Query q = null;
		try {
			// pm.makePersistent(ca);
			pm.makePersistent(album1);
			// pm.makePersistent(album2);
			try {
				tx.commit();
			} catch (Exception e) {
				e.printStackTrace();
			}

			q = pm.newQuery("select from " + Category.class.getName());
			q.setFilter("categoryname == categorynameParam");
			q.declareParameters("String categorynameParam");
			List<Category> cs = (List<Category>) q.execute("CDアルバム");
			assertEquals(1, cs.size());
			assertEquals("CDアルバム", cs.get(0).getCategoryname());

			q = pm.newQuery("select from " + Album.class.getName());
			q.setFilter("albumname == albumnameParam");
			q.declareParameters("String albumnameParam");
			List<Album> as = (List<Album>) q.execute("jeremy");
			assertEquals(1, as.size());
			assertEquals("jeremy", as.get(0).getAlbumname());

		} finally {
			pm.close();
		}

	}

	/**
	 *
	 * 所有(自動的にエンティティグループ)の1:多関連
	 *
	 */
	public void testInsertOnetoManyOwned() {
		Category ca = new Category();
		Key categoryKey = KeyFactory.createKey(Category.class.getSimpleName(),
				"abcdefghijklmn");
		ca.setKey(KeyFactory.keyToString(categoryKey));
		ca.setCategoryname("書籍");
		Book book1 = new Book();
		Book book2 = new Book();

		book1.setBookname("Crime and Punishment");
		book2.setBookname("On the Road");

		ca.setBooks(Arrays.asList(book1, book2));
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Transaction tx = pm.currentTransaction();

		tx.begin();
		Query q = null;
		try {
			pm.makePersistent(ca);
			try {
				tx.commit();
			} catch (Exception e) {
				e.printStackTrace();
			}
			q = pm.newQuery("select from " + Book.class.getName());
			q.setFilter("bookname == booknameParam");
			q.declareParameters("String booknameParam");
			List<Book> ms = (List<Book>) q.execute("On the Road");

			assertEquals(1, ms.size());
			assertEquals("On the Road", ms.get(0).getBookname());

		} finally {
			pm.close();
		}

	}

}