最終更新: chipstar_light 2010年08月24日(火) 12:53:03履歴
JDOの検索で取得したListにアクセスすると、org.datanucleus.exceptions.NucleusUserException: Object Manager has been closedで落ちることがある。
JDOでアクセスして取得した結果のListは、取得した瞬間ではまだロードされておらず、Listにアクセスした時点で初めてロードされるみたいです。
この時、Listにアクセスせずに、PersistenceManagerをcloseしてしまうと、二度とListの中身にはアクセスできないみたい。
これを回避するためには、アクセスした結果を"detach"しないといけないらしい。
detachする手っ取り早い方法は以下のように、pm.detachCopyAll(List)を呼び出す。
他にもいろいろ方法があるようです。
PersistenceManager pm = JDOHelper.getPersistenceManagerFactory("transactions-optional").getPersistenceManager(); try { Query query = pm.newQuery(Hoge.class); if (condition != null) { query.setFilter("(項目名) == condition"); query.declareParameters("String condition"); } List<Hoge> result = (List<Hoge>) query.execute(condition); return result; } finally { pm.close(); }
JDOでアクセスして取得した結果のListは、取得した瞬間ではまだロードされておらず、Listにアクセスした時点で初めてロードされるみたいです。
この時、Listにアクセスせずに、PersistenceManagerをcloseしてしまうと、二度とListの中身にはアクセスできないみたい。
これを回避するためには、アクセスした結果を"detach"しないといけないらしい。
detachする手っ取り早い方法は以下のように、pm.detachCopyAll(List)を呼び出す。
他にもいろいろ方法があるようです。
PersistenceManager pm = JDOHelper.getPersistenceManagerFactory("transactions-optional").getPersistenceManager(); try { Query query = pm.newQuery(Hoge.class); if (condition != null) { query.setFilter("(項目名) == condition"); query.declareParameters("String condition"); } List<Hoge> result = (List<Hoge>) query.execute(condition); pm.detachCopyAll(result); return result; } finally { pm.close(); }
コメントをかく