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

标签 java google-app-engine datanucleus

在 Java 中创建拥有的一对多关系时,我注意到使用低级数据存储 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;

    ...
 }

额外的属性(property)是无害的。但是为什么这对于 JDO 是必需的?

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

最佳答案

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

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

关于java - GAE/J 低级数据存储 API 和 DataNucleus JDO 之间拥有的一对多关系的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653629/

相关文章:

java - Spring:根据 View 重定向

python - AppEngine BlobStore 上传失败,请求在开发环境中有效

java - JPQL:在更新中将列设置为空

java - GAE/J 中的投影查询可带来性能提升

java - 无法使用 DataNucleus GAE/J 插件版本 2 将字节代码增强为 JDO 3.0

java - 如何创建自定义 portlet 操作/模式以及如何在 Liferay 中调用它们?

java - 我如何获得 Vector<type> Arraylist<type> 作为 call() 的返回值?

java - 从字符串数组中获取包含指定字符的字符串列表

java - maven-application.xml 文件有什么用?

java - 在 Google App Engine for Java 的子域之间共享当前用户数据