Java 查询无法检索嵌入的JDO字段

Java 查询无法检索嵌入的JDO字段,java,google-app-engine,jdo,datanucleus,Java,Google App Engine,Jdo,Datanucleus,我正在使用AppEngine的JDO实现的本地开发版本。当我查询一个包含其他对象作为嵌入字段的对象时,嵌入字段返回为null 例如,假设这是我坚持的主要对象: @PersistenceCapable public class Branch { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private

我正在使用AppEngine的JDO实现的本地开发版本。当我查询一个包含其他对象作为嵌入字段的对象时,嵌入字段返回为null

例如,假设这是我坚持的主要对象:

@PersistenceCapable
public class Branch {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String name;

    @Persistent
    private Address address;

            ...
}
这是我的嵌入对象:

@PersistenceCapable(embeddedOnly="true")
public class Address {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String street;

    @Persistent
    private String city;

            ...
}
    PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager();

    Branch branch = null;
    try {
        branch = pm.getObjectById(Branch.class, branchId);
    }
    catch (JDOObjectNotFoundException onfe) {
        // not found
    }
    catch (Exception e) {
        // failed
    }
    finally {
        pm.close();
    }
以下代码无法检索嵌入对象:

@PersistenceCapable(embeddedOnly="true")
public class Address {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String street;

    @Persistent
    private String city;

            ...
}
    PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager();

    Branch branch = null;
    try {
        branch = pm.getObjectById(Branch.class, branchId);
    }
    catch (JDOObjectNotFoundException onfe) {
        // not found
    }
    catch (Exception e) {
        // failed
    }
    finally {
        pm.close();
    }

有人能解决这个问题吗?如何检索分支对象及其嵌入的地址字段?

我遇到了类似的问题,发现默认的获取组中不包含嵌入的字段。要加载所需字段,您必须在关闭持久性管理器之前为其调用getter,或者将fetch组设置为加载所有字段

这意味着以下几点

branch = pm.getObjectById(Branch.class, branchId);
pm.close();
branch.getAddress();  // this is null

branch = pm.getObjectById(Branch.class, branchId);
branch.getAddress();  // this is not null
pm.close();
branch.getAddress();  // neither is this
因此,您需要按如下方式更改代码:

Branch branch = null;
try {
    branch = pm.getObjectById(Branch.class, branchId);
    branch.getAddress();
}
catch (JDOObjectNotFoundException onfe) {
    // not found
}
catch (Exception e) {
    // failed
}
finally {
    pm.close();
}
或者,您可以按如下方式将“获取”组设置为包含所有字段

pm.getFetchPlan().setGroup(FetchGroup.ALL);
branch = pm.getObjectById(Branch.class, branchId);
pm.close();
branch.getAddress();  // this is not null

谢谢你的及时答复!我将对此进行测试,并让您知道它是否有效。如果某个字段位于活动的fetch组中,则显然应该对其进行提取。如果你说不是,那么为什么不提供一个简单的测试用例并在不报告时报告它呢?这可能意味着项目中没有人知道itI。我不确定这是一个bug还是JDO规范的一部分。我记得在某个地方读到,JDO规范中有关于延迟加载嵌入字段的规定,但我现在找不到它。不管怎样,我之前的评论都站得住脚