最近は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(); } } }