読者です 読者をやめる 読者になる 読者になる

GAE/JでJDODetachedFieldAccessExceptionが発生した場合

google appengine for javaでJDODetachedFieldAccessExceptionが発生した。

エラーメッセージ

javax.jdo.JDODetachedFieldAccessException: You have just attempted to access field "toAddressList" yet this field was not detached when you detached the object. Either dont access this field, or detach it when detaching the object.

解決方法はdefaultFetchGroup="true"

@Persistent(defaultFetchGroup="true")  
private List<String> toAddressList;

問題

遅延取得するプロパティに対して値を取得せずにdetachedしてた。そのdetachedしたオブジェクトで遅延取得なプロパティから値を取得しようとしたら当該エラーが出る。
 
JDOではフェッチグループという概念があり、エンティティ内でString、Dateといった基本的な型以外は遅延して取得する。defaultFetchGroupをtrueにすることで遅延取得せずに値をとることができる。

Google appengine SDK 1.2.5になってdefaultFetchGroupの扱いが変わったので注意

Google appengine SDK 1.2.2の時はList型であってもdefaultFetchGroupは"true"になっていたが、1.2.5になってからはdefaultFetchGroupは"false"のようだ。1.2.5にバージョンアップする人は注意。