gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:08:27 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com