Subscribed unsubscribe Subscribe Subscribe

GAE/J でDataStoreのよくわからない挙動に遭遇

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節の外で参照しても効果は無いみたい。
この違いは何だ…?