我正在使用 DataNucleus 3.0.0-release 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-release 可用,但我不能使用它,因为它的增强器有问题。