Cayenneの簡単なテスト

では、Messageオブジェクトが出来上がったので、Cayenneのコーディングをやってみます。
WebObjectsのEOFに似ている事がよく分かると思います。

まずは、新規のMessageオブジェクトをインサートしてみます。

インサートのサンプル(Cayenne

	public void testInsert() {
		Message mes = new Message();
		mes.setSubject("タイトル");
		mes.setUserName("テスト君");
		mes.setUserPass("test");
		mes.setMail("mail@test.com");
		mes.setUrl("http://www.test.com");
		mes.setContent("テストの書き込みです。");
		Date now = new Date();
		mes.setSubmitDate(now);
		mes.setModificationDate(now);

		DataContext context = Configuration.getSharedConfiguration().getDomain().createDataContext();
		context.registerNewObject(mes);
		context.commitChanges(Level.WARN);
	}

context.commitChangesの時に、Log4jのLevelをセットしてあげると、ロギングしてくれます。

WARN QueryLogger: INSERT INTO message (content, id, m_date, mail, p_id, s_date, subject, url, user_name, user_pass) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
WARN QueryLogger: [bind: 'テストの書き込みです。', 320, '2004-09-01 10:40:16.824', 'mail@test.com', NULL, '2004-09-01 10:40:16.824', 'タイトル', 'http://www.test.com', 'テスト君', 'test']

EOFでは、以下のような感じになります。

インサートのサンプル(EOF)

		EOEditingContext context = new EOEditingContext();
		context.insertObject(mes);
		context.saveChanges();

DataContextをEOEditingContextと読み替えると、EOFのコーディングと似ている事がよく分かると思います。

つぎに、セレクトしてみましょう。

セレクトのサンプル(Cayenne

	public void testSelect() {
		SelectQuery query = new SelectQuery("Message");
		query.setLoggingLevel(Level.WARN);
		Expression expression = ExpressionFactory.matchExp("subject", "タイトル");
		query.setQualifier(expression);

		DataContext context = Configuration.getSharedConfiguration().getDomain().createDataContext();
		List allDatas = context.performQuery(query);

		for (int i = 0; i < allDatas.size(); i++) {
			Message mes = (Message) allDatas.get(i);
			System.out.println(mes);
		}

	}

ログには以下のような感じで表示されます。
subject="タイトル"の項目が2つ登録されている事が分かります。

WARN  QueryLogger: === returned 2 rows. - took 273 ms.
{[	userName => テスト君
	parentId => null
	modificationDate => Wed Sep 01 10:35:12 JST 2004
	content => テストの書き込みです。
	url => http://www.test.com
	submitDate => Wed Sep 01 10:35:12 JST 2004
	toParent => org.objectstyle.cayenne.Fault$ToOneFault@9ffb18
	subject => タイトル
	mail => mail@test.com
	children => org.objectstyle.cayenne.Fault$ToManyFault@1de914
	userPass => test
]<oid: bbs.data.Message:  <id: 300>; state: committed>}

{[	userName => テスト君
	parentId => null
	modificationDate => Wed Sep 01 10:40:16 JST 2004
	content => テストの書き込みです。
	url => http://www.test.com
	submitDate => Wed Sep 01 10:40:16 JST 2004
	toParent => org.objectstyle.cayenne.Fault$ToOneFault@9ffb18
	subject => タイトル
	mail => mail@test.com
	children => org.objectstyle.cayenne.Fault$ToManyFault@1de914
	userPass => test
]<oid: bbs.data.Message:  <id: 320>; state: committed>}

このQueryオブジェクトを作る所も、EOFが意識されている事が分かります。
EOFなら以下のように書けるでしょう。

セレクトのサンプル(EOF)

		EOQualifier qual = EOQualifier.qualifierWithQualifierFormat("subject = 'タイトル'",null);
		EOFetchSpecification fetchSpec = new EOFetchSpecification("Message",qual,null);
		NSArray allDatas = context.objectsWithFetchSpecification(fetchSpec);

SQLでいう所の「ORDER BY」を付けるには、Cayenneではqueryを作っている所に以下を追加します

クエリの例(Cayenne

		query.addOrdering("submitDate",false);

ここの第二引数のfalseはORDER BY DESCにする場合はtrueにするという意味です。

EOFだと、ちょっと面倒なコーディングになります。

クエリの例(EOF)

		EOSortOrdering sortOrder = EOSortOrdering.sortOrderingWithKey("submitDate",EOSortOrdering.CompareAscending);
		NSArray orderings = new NSArray( new Object[] {sortOrder} );
		EOQualifier qual = EOQualifier.qualifierWithQualifierFormat("subject = 'タイトル'",null);
		EOFetchSpecification fetchSpec = new EOFetchSpecification("Message",qual,orderings);
		NSArray allDatas = context.objectsWithFetchSpecification(fetchSpec);

この辺のクエリを作るコーディングは、Cayenneの方が洗練されているような気がします。
WebObjectsのEOModelerでFetchSpecficationをGUIで作れるので、楽は楽なんですが・・・