DataNucleus 3.0.0 リリースの JDO 実装を使用して、Java アプリを MongoDB に接続しています。
私の CLASSPATH 内の関連する JAR は次のとおりです。
- datanucleus-api-jdo-3.0.0-release.jar
- datanucleus-core-3.0.0-release.jar
- datanucleus-jdo-query-3.0.0-release.jar
- datanucleus-mongodb-3.0.0-release.jar
- mongo-java-driver-2.5.2.jar
更新: この問題はバージョン 3.1 でも発生し、DataNucleus の Level2 キャッシュに関連しています。回避策については、以下の私の回答を参照してください。
ロードしようとしているクラスは次のとおりです。
@PersistenceCapable(detachable = "true")
public class UserProfile implements Serializable, Cacheable<String> {
private static final long serialVersionUID = 7132595253084641884L;
@PrimaryKey
@Persistent(defaultFetchGroup = "true")
private String username;
@Persistent(defaultFetchGroup = "true")
private String name;
@Persistent(defaultFetchGroup = "true")
private String surname;
@Persistent(embeddedElement = "true", defaultFetchGroup = "true")
private Map<String, UserProfileSummary> connections;
...
}
以下は UserProfileSummary クラスです。
@PersistenceCapable(embeddedOnly = "true")
public class UserProfileSummary implements Serializable {
private static final long serialVersionUID = 6120670018375572406L;
@Persistent(defaultFetchGroup = "true")
private String username;
@Persistent(defaultFetchGroup = "true")
private String fullName;
...
}
以下は、タイプの格納されたオブジェクトをロードしようとしている方法ですUserProfile
:
PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager();
UserProfile profile = null;
try {
profile = pm.getObjectById(UserProfile.class, username);
}
catch (JDOObjectNotFoundException onfe) {
// handle
}
catch (Exception e) {
// handle
}
問題は、 のconnections
フィールドがUserProfile
正しくロードされることもあれば、null
への同じ呼び出しと同じようにロードされることもありgetObjectById()
ます。フィールドは にあるようにマークされているdefaultFetchGroup
ため、毎回ロードする必要があります。
これは DataNucleus のバグ (競合状態?) でしょうか? 他の誰かが同じ問題を経験していますか?
注: DataNucleus 3.1.0 リリースが利用可能であることは知っていますが、エンハンサーに問題があるため使用できません。