1

我有两个类定义和映射到GAE数据存储 - Person类和LocationStamp类,它表示一个单一的纬度/经度组合和一个时间戳。在PersonLocationStamp之间有一个拥有的一对多映射,其实现方式与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实体(并没有在表中显示为locationStampsPerson任何列。

我跟着仔细论坛帖子的说明,但我不敢肯定,如果我失去了一些东西

这里是我的实体:

@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(); 
    } 

回答

1

当你有一个持久性对象列表,列表中的负载是一个懒惰的操作。因此,如果您在加载列表之前关闭PersistenceManager,则列表将不会加载。

尝试使用:

public Person getProfileForCurrentUser() 
{ 
    PersistenceManager pm = getPersistenceManager(); 
    try { 
     Key k = getKeyForEmailAddress(getCurrentUserEmail()); 
     Person p = pm.getObjectById(Person.class, k); 
     p.getLocationStamps().size(); 
     return p; 
    } catch (JDOObjectNotFoundException e) { 
     // Create a new profile if the new one isn't found 
     return updateProfileForCurrentUser(new Person()); 
    } finally { 
     pm.close(); 
    } 
} 
+0

优秀。我认为当我遵循论坛帖子的指示时,我摆脱了所有懒惰加载问题,但我显然也需要明确加载列表。 – 2012-01-17 00:47:52

相关问题