encodeしたStringをキーにしたデータモデルを作って、そのキーで引き当てて取得したデータを参照しようとしたらUserが何故かnullになっていた。
@PersistenceCapable(identityType = IdentityType.APPLICATION) public class Hoge { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") private String encodedKey; @Persistent private User user; ... }
Hoge hoge = null; PersistenceManager pm = PMF.get().getPersistenceManager(); try { // requestのkeyから引き当てる Key key = KeyFactory.stringToKey(req.getParameter("key")); hoge = pm.getObjectById(Hoge.class, key); } catch (Exception e) { } finally { pm.close(); } if (hoge.getUser() != null) { LOGGER.info(hoge.getUser().toString()); } else { LOGGER.warning("NULL!!"); }
結果:
WARNING: NULL!!
で、try節の中で一度Userを参照するとnullじゃなくなる。
Hoge hoge = null; PersistenceManager pm = PMF.get().getPersistenceManager(); try { Key key = KeyFactory.stringToKey(req.getParameter("key")); hoge = pm.getObjectById(Hoge.class, key); hoge.getUser(); // この行を書き加えるだけ } catch (Exception e) { } finally { pm.close(); } if (hoge.getUser() != null) { LOGGER.info(hoge.getUser().toString()); } else { LOGGER.warning("NULL!!"); }
結果:
INFO: username
なんでー!?そこで参照すると何かが起こるの??
try-catch-finally節の外で参照しても効果は無いみたい。
この違いは何だ…?