与DataNucleus 3.x的1-N关系的片状加载

时间:2012-08-07 12:37:04

标签: java mongodb jdo datanucleus

我使用DataNucleus 3.0.0发布的JDO实现将我的Java应用程序连接到MongoDB。

我的CLASSPATH中的相关JAR如下:

  • DataNucleus将-API-JDO-3.0.0-release.jar
  • DataNucleus将核 - 3.0.0-release.jar
  • DataNucleus将-JDO查询-3.0.0-release.jar
  • DataNucleus将-mongodb的-3.0.0-release.jar
  • 蒙戈-java的驾驶员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的{​​{1}}字段有时会正确加载,但有时会加载为UserProfile,同时调用null。该字段标记为getObjectById(),因此每次都应加载。

这可能是DataNucleus错误(竞争条件?)?还有其他人遇到同样的问题吗?

注意:我知道DataNucleus 3.1.0版本可用,但由于problem with its enhancer我无法使用它。

1 个答案:

答案 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>