我有两个类定义和映射到GAE数据存储 - Person
类和LocationStamp
类,它表示一个单一的纬度/经度组合和一个时间戳。在Person
和LocationStamp
之间有一个拥有的一对多映射,其实现方式与a forum post on one-to-many relationships类似。为什么我所拥有的一对多关系不能持久保存到GAE数据存储中?
在我的DAO的Person
,我有以下方法:
public LocationStamp addLocationStampForCurrentUser(LocationStamp ls)
{
PersistenceManager pm = getPersistenceManager();
Person p = getProfileForCurrentUser();
p.getLocationStamps().add(ls);
pm.currentTransaction().begin();
try {
pm.makePersistent(p);
pm.currentTransaction().commit();
return ls;
} finally {
if (pm.currentTransaction().isActive()) {
pm.currentTransaction().rollback();
}
pm.close();
}
}
,当我尝试使用此方法添加到LocationStamp
实体对象的集合中的条目,的关系没有得到持续。以后查询相关的Person
对象时会返回包含电子邮件地址的正确对象,但locationStamps
列表为空。此外,数据浏览器的应用程序引擎服务器不显示任何LocationStamp
实体(并没有在表中显示为locationStamps
为Person
任何列。
我跟着仔细论坛帖子的说明,但我不敢肯定,如果我失去了一些东西
这里是我的实体:
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Person
{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String emailAddress;
@Persistent
private String name;
@Persistent(mappedBy = "person")
@Element(dependent = "true")
@Order(extensions = @Extension(vendorName = "datanucleus", key = "list-ordering", value = "timestamp desc"))
private final List<LocationStamp> locationStamps = new ArrayList<LocationStamp>();
// ... getters and setters ...
}
和
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class LocationStamp
{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private double latitude;
@Persistent
private double longitude;
@Persistent
private Date timestamp;
@Persistent
private boolean automatic;
@Persistent
private Person person;
// ... getters and setters ...
}
因为他们是在上面的代码中使用,这里有一对夫妇的其他方法的定义:
public Person getProfileForCurrentUser()
{
PersistenceManager pm = getPersistenceManager();
try {
Key k = getKeyForEmailAddress(getCurrentUserEmail());
return pm.getObjectById(Person.class, k);
} catch (JDOObjectNotFoundException e) {
// Create a new profile if the new one isn't found
return updateProfileForCurrentUser(new Person());
} finally {
pm.close();
}
}
public Person updateProfileForCurrentUser(Person p)
{
p.setEmailAddress(getCurrentUserEmail());
return update(p);
}
public Person update(Person p)
{
PersistenceManager pm = getPersistenceManager();
try {
pm.currentTransaction().begin();
Key k = getKeyForEmailAddress(p.getEmailAddress());
p.setKey(k);
pm.makePersistent(p);
pm.currentTransaction().commit();
return p;
} finally {
if (pm.currentTransaction().isActive()) {
pm.currentTransaction().rollback();
}
pm.close();
}
}
private Key getKeyForEmailAddress(String emailAddress)
{
return KeyFactory.createKey(Person.class.getSimpleName(), emailAddress);
}
private static PersistenceManager getPersistenceManager()
{
// PMF is a singleton class that returns an instance of PersistenceManagerFactory
return PMF.get().getPersistenceManager();
}
优秀。我认为当我遵循论坛帖子的指示时,我摆脱了所有懒惰加载问题,但我显然也需要明确加载列表。 – 2012-01-17 00:47:52