0

在 Java 中创建拥有的一对多关系时,我注意到使用低级 Datastore API 和 DataNucleus JDO 之间的结果记录存在差异。不确定这是故意的还是任何解决方法。

例如,

如果以下链接中有员工的多个地址:

https://developers.google.com/appengine/docs/java/datastore/entities#Ancestor_Paths

使用如下低级数据存储 api,员工记录不显示地址列(即属性):

Entity employee = new Entity("Employee");
datastore.put(employee);

Entity address_home = new Entity("Address", employee.getKey());
datastore.put(address_home);

Entity address_mailing = new Entity("Address", employee.getKey());
datastore.put(address_mailing);

使用 JDO,员工记录显示一个地址列(即属性):

@PersistenceCapable
public class Employee {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent(mappedBy = "employee")
    private List<Address> addresses;

    List<Address> getAddresses() {
        return addresses;
    }
    void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }

    // ...
}

@PersistenceCapable
public class Address {
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private Employee employee;

    @Persistent
    private String Street;

    ...
 }

额外的财产是无害的。但是,为什么这对 JDO 来说是必需的?

我在开发服务器上使用带有 DataNucleus v2 的 GAE/J 1.7.2。

4

1 回答 1

1

GAE JDO 插件的最新存储版本会将对象中的所有关系作为属性存储,因此 Employee 类将具有它存储的地址的属性。这是一种比 GAE JDO 用来存储东西的方式更合乎逻辑的存储方式(它最初试图模拟外键,使用对方的所有权)。将 List 存储在所有者中具有将元素加载到集合中的优势,以及允许元素多次出现在 List 中(而对于较旧的存储版本,这是不可能的)。

所有版本的 GAE JDO 直到并包括 2.1.1 都将索引位置存储在列表中的每个地址中,而实际上它们现在不需要存储,因为 Employee 中的“地址”属性提供了这一点 - 这是从早期遗留下来的需要它的版本以这种方式存储。2.1.2 及以后的版本不会将该列表索引属性添加到元素中。

于 2012-09-30T06:21:00.640 回答