2013-11-09 25 views
1

我在GAE中使用JDO。我有两个具有一对多关系的JDO类。父类是GAE + JDO:在Google应用引擎中删除子对象导致问题java

@PersistenceCapable(detachable="true") 
@FetchGroup(name="childerns", members={@Persistent(name="aliasName")}) 
public class IdentityProvider { 

@PrimaryKey 
@Persistent 
private String url; 
@Persistent 
private String domainName; 
@Persistent 
@Element(dependent = "true") 
private ArrayList<AliasDomain> aliasName = new ArrayList<AliasDomain>(); 

} 

子类是

@PersistenceCapable(detachable = "true") 
public class AliasDomain { 
@Persistent 
private String url; 
@Persistent 
private String aliasName; 
@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key key; 
} 

我只是在两个实体进行CURD操作。首先我创建父实例,然后我创建子实例作为

public void addAliasDomain(AliasDomain domain) { 
    String url = domain.getUrl(); 
    PersistenceManager pm = PMFSingleton.get().getPersistenceManager(); 
    IdentityProvider idp = null; 
    Transaction txn = null; 
    try { 
     txn = pm.currentTransaction(); 
     txn.begin(); 
     pm.getFetchPlan().addGroup("childerns"); 
     idp = pm.getObjectById(IdentityProvider.class, url); 
     idp = pm.detachCopy(idp); 
     idp.getAliasName().add(domain); 
     pm.makePersistent(idp); 
     txn.commit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (txn.isActive()) { 
      txn.rollback(); 
     } 
     pm.close(); 
    } 
} 

我的问题是创建时,我删除任何子实例。正如你从上面的函数中看到的,我将孩子链接到父母(意味着将孩子对象添加到arrayList中)。所以,当孩子被删除其父母引用不是在父母的分离时间删除,因此反对我得到的例外是作为

Object of type "user.oauth.jdo.model.IdentityProvider" and identity "yahoo.com" was not  detached correctly. Please consult the log for any possible information. 
org.datanucleus.exceptions.NucleusUserException: Object of type "user.oauth.jdo.model.IdentityProvider" and identity "yahoo.com" was not detached correctly. Please consult the log for any possible information. 
at org.datanucleus.state.JDOStateManager.detachCopy(JDOStateManager.java:2942) 
at org.datanucleus.ObjectManagerImpl.detachObjectCopy(ObjectManagerImpl.java:2591) 
at org.datanucleus.api.jdo.JDOPersistenceManager.jdoDetachCopy(JDOPersistenceManager.java:1145) 
    at org.datanucleus.api.jdo.JDOPersistenceManager.detachCopy(JDOPersistenceManager.java:1174) 
at user.oauth.data.broker.IDPJDOBroker.retrieveDomainList(IDPJDOBroker.java:49) 

功能retreiveDomainList的IDPJDOBroker的代码是

public List retrieveDomainList() { 
    PersistenceManager pm = PMFSingleton.get().getPersistenceManager(); 
    Query query = pm.newQuery(IdentityProvider.class); 
    List<IdentityProvider> list = null; 
    List<IdentityProvider> detachedList = null; 
    IdentityProvider idp = null; 
    try { 
     pm.getFetchPlan().addGroup("childerns"); 
     list = (List<IdentityProvider>) query.execute(); 
     detachedList = new ArrayList<IdentityProvider>(); 
     for(IdentityProvider obj : list){ 
      idp = pm.detachCopy(obj); 
      OAuthJDOBroker broker = new OAuthJDOBroker(); 
      int actUsers = 0; 
      if (idp.getHistory() != null && idp.getHistory().size() > 0) { 
       actUsers = broker.calculateActiveUser(idp.getUserActiveDuration(),idp.getDomainName()); 
      } 
      idp.setActiveUsers(actUsers); 
      detachedList.add(idp); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     query.closeAll(); 
     pm.close(); 
    } 
    return detachedList; 
} 

请告诉我该怎么做? JDO不可能删除孩子吗?如果有可能,那么如何正确地做到这一点。

回答

0

我刚才已经看到了这一点,但如果任何人来到这里,要删除一个一对多的关系的子对象必须删除从父参考,子对象将是“透明的”

删除