我使用DataNucleus 3.0.0发布的JDO实现将我的Java应用程序连接到MongoDB。
我的CLASSPATH中的相关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
的{{1}}字段有时会正确加载,但有时会加载为UserProfile
,同时调用null
。该字段标记为getObjectById()
,因此每次都应加载。
这可能是DataNucleus错误(竞争条件?)?还有其他人遇到同样的问题吗?
注意:我知道DataNucleus 3.1.0版本可用,但由于problem with its enhancer我无法使用它。
答案 0 :(得分:0)
我关闭了DataNucleus level2缓存,并且从初步测试看来这个问题似乎已经消失了。
要关闭level2缓存,请将以下行添加到jdoconfig.xml:
<jdoconfig xmlns="http://java. ... .xsd">
<persistence-manager-factory name="MyPMF">
...
<property name="datanucleus.cache.level2.type" value="none" />
</persistence-manager-factory>
</jdoconfig>