昨日できなかった検索対応やってます
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の状態とかもう少し学んでいかなければいけないなと痛感。がんばります。