昨日できなかった検索対応やってます

slim3でgwtやってます。昨日のひがさんのコメントを参考に、modelの内部的な状態とかまだきちんと理解してないけれど、とりあえず動かしてみることを目標にやってみる。detachCopyするとjdoStateManagerってのがnullになる。それは分かるけどさ。なにがどうってのはわからない。ちゃんと勉強します。


まずはこうするが、

public List<Cat> findAll() {
	List<Cat> catlist = from().getResultList();
    PersistenceManager pm = CurrentPersistenceManager.get();
	Collection<Cat> col = pm.detachCopyAll(catlist);
	for (Cat cat : col) {
		Kind kind = JDOHelper.getPersistenceManager(cat).getObjectById(
				Kind.class, cat.getKindKey());
		cat.setNotpersistkind(pm.detachCopy(kind));
	}
	return catlist;
}

この状態のCatからPersistenceManagerが取得できないのでエラーになる。


次に、一応kindだけdetachCopyしてみて試してみる。

public List<Cat> findAll() {
	List<Cat> catlist = from().getResultList();
	PersistenceManager pm = CurrentPersistenceManager.get();
	for (Cat cat : catlist) {
		Kind kind = JDOHelper.getPersistenceManager(cat).getObjectById(
				Kind.class, cat.getKindKey());
		cat.setNotpersistkind(pm.detachCopy(kind));
	}
	return catlist;

そらそうなるわ。ということで昨日と同じ結果になります。GWTServiceServlet#invokeのdetachCopyALLでnotpersistkindが消えます。


で、こうした。

public List<Cat> findAll() {
	List<Cat> catlist = from().getResultList();
    PersistenceManager pm = CurrentPersistenceManager.get();
	List<Cat> newcatList = new ArrayList<Cat>();
	for (Cat cat : catlist) {
		Kind kind = JDOHelper.getPersistenceManager(cat).getObjectById(
				Kind.class, cat.getKindKey());
		cat = pm.detachCopy(cat);
		cat.setNotpersistkind(pm.detachCopy(kind));
		newcatList.add(cat);
	}
	return newcatList;
}

こうしてreturnすると、GWTServiceServlet#invokeでdetachCopyALLしないので、ちゃんと表示されるようになりました。ありがとうございました。というかmodelの状態とかもう少し学んでいかなければいけないなと痛感。がんばります。