在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。
答案 0 :(得分:1)
GAE JDO插件的最新存储版本将所有关系存储在对象中作为属性,因此Employee类将具有其存储的地址的属性。与GAE JDO用于存储事物的方式相比,这是存储事物的更合乎逻辑的方式(它最初尝试使用另一方的所有权来模拟外键)。将List存储在所有者中有利于将元素加载到集合中,以及允许元素多次出现在List中(而对于不可能的旧存储版本)。
GAE JDO的所有版本(包括2.1.1)都存储在List中的每个Address中的索引位置,而实际上它们现在不需要存储,因为Employee中的“addresses”属性提供了 - 这是遗留的从需要以这种方式存储的早期版本开始。版本2.1.2以后不会将该列表索引属性添加到元素。