GAE / J低级数据存储API和DataNucleus JDO之间拥有的一对多关系的差异

时间:2012-09-29 14:36:36

标签: java google-app-engine datanucleus

在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的必需品?

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

1 个答案:

答案 0 :(得分:1)

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

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