Here are the Domain classes that have the problem. Please let me know if
you need more information.
--Jeff
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Player {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long key;
@Persistent
private Long userKey;
@Persistent
private String userName;
@Persistent
private Long cityKey;
@Persistent
private Long originalFamilyKey;
@Persistent
private Long currentFamilyKey;
//**** Money ****
@Persistent
private int money = 0;
@Persistent
private int totalMoneyReceived = 0;
//***** Store ****
@Persistent
private int storeX = -1;
@Persistent
private int storeY = -1;
@Persistent
private String storeName;
@Persistent
private String storeImage;
@Persistent(mappedBy = "target")
private Set<Convincer> convincers = new HashSet<Convincer>();
//***** Troops/Challenge ****
@Persistent
private int muscle;
@Persistent
private int dames;
@Persistent(mappedBy = "owner")
private Set<TroopHire> activeTroopHires = new HashSet<TroopHire>();
@Persistent
private Long activeChallengeAgainstKey;
@Persistent(defaultFetchGroup = "true")
private Set<Long> activeChallengeMoveKeys;
public Set<TroopHire> getActiveTroopHiresClean() {
Iterator<TroopHire> hireIterator = activeTroopHires.iterator();
DateTime now = TimeUtil.currentTime();
while (hireIterator.hasNext()) {
TroopHire troopHire = hireIterator.next();
if (troopHire.getAvailableTime().isBefore(now) ||
troopHire.isEmpty()) {
//This is a work around for a GAE Bug 2009.12.1
hireIterator.remove();
}
}
return activeTroopHires;
}
public void unhireTroops(Troops troops, DateTime hireDate) {
//TODO run Nate's Algorithm to check that you can unhire
City city = PM.getObjectById(City.class, cityKey);
boolean found = false;
for (TroopHire troopHire : getActiveTroopHiresClean()) {
if (troopHire.getHireTime().equals(hireDate)) {
found = true;
troopHire.unhireTroops(troops);
muscle -= troops.muscle;
dames -= troops.dames;
addMoney(city.getDeployCost(troops));
break;
}
}
if (!found) {
throw new SlowPlayException("Unhire not legal. Bad
availableTime");
}
}
}
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class TroopHire implements Comparable<TroopHire> {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private Player owner;
@Persistent
private int muscle;
@Persistent
private int dames;
@Persistent
private Date hireTime;
@Persistent
private Date availableTime;
}
On Tue, Dec 1, 2009 at 9:49 AM, Max Ross (Google)
<[email protected]<maxr%[email protected]>
> wrote:
> Could you please post the model objects that are involved? Also, what
> version of the SDK are you using?
>
> Thanks,
> Max
>
> On Mon, Nov 30, 2009 at 2:26 PM, Jeffrey Goetsch <[email protected]>wrote:
>
>> Update: This appears to happen when I remove the last entry in the Set.
>>
>> --Jeff
>>
>>
>> On Mon, Nov 30, 2009 at 2:21 PM, Jeffrey Goetsch <[email protected]>wrote:
>>
>>> I am getting this exception when I try and remove an Owned object from a
>>> Set. Let me know if you need more then the stack trace.
>>>
>>> Thanks,
>>> Jeffrey
>>>
>>>
>>> Caused by: org.datanucleus.exceptions.NucleusUserException:
>>> deletePersistent() called recursively
>>> at
>>> org.datanucleus.state.JDOStateManagerImpl.internalDeletePersistent(JDOStateManagerImpl.java:4184)
>>> at
>>> org.datanucleus.state.JDOStateManagerImpl.deletePersistent(JDOStateManagerImpl.java:4166)
>>> at
>>> org.datanucleus.ObjectManagerImpl.deleteObjectInternal(ObjectManagerImpl.java:1470)
>>> at
>>> org.datanucleus.store.mapped.scostore.FKSetStore.remove(FKSetStore.java:527)
>>> at
>>> org.datanucleus.store.appengine.DatastoreFKSetStore.remove(DatastoreFKSetStore.java:78)
>>> at org.datanucleus.sco.backed.Set.remove(Set.java:712)
>>> at org.datanucleus.sco.backed.Set.remove(Set.java:672)
>>> at
>>> org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.preDelete(PersistenceCapableMapping.java:1308)
>>> at
>>> org.datanucleus.store.appengine.DependentDeleteRequest.execute(DependentDeleteRequest.java:71)
>>> at
>>> org.datanucleus.store.appengine.DatastorePersistenceHandler.deleteObject(DatastorePersistenceHandler.java:533)
>>> at
>>> org.datanucleus.state.JDOStateManagerImpl.internalDeletePersistent(JDOStateManagerImpl.java:4198)
>>> at
>>> org.datanucleus.state.JDOStateManagerImpl.deletePersistent(JDOStateManagerImpl.java:4166)
>>> at
>>> org.datanucleus.ObjectManagerImpl.deleteObjectInternal(ObjectManagerImpl.java:1470)
>>> at
>>> org.datanucleus.store.mapped.scostore.FKSetStore.remove(FKSetStore.java:527)
>>> at
>>> org.datanucleus.store.appengine.DatastoreFKSetStore.remove(DatastoreFKSetStore.java:78)
>>> at org.datanucleus.sco.backed.Set.remove(Set.java:712)
>>> at org.datanucleus.sco.backed.Set.remove(Set.java:672)
>>> at
>>> com.slowplay.mobworld.commons.server.domain.Player.unhireTroops(Player.java:456)
>>> at
>>> com.slowplay.mobworld.citywars.server.CityWarsServiceImpl.unhire(CityWarsServiceImpl.java:146)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>> at java.lang.reflect.Method.invoke(Method.java:592)
>>> at
>>> com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
>>> ... 27 more
>>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Google App Engine for Java" group.
>> To post to this group, send email to
>> [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<google-appengine-java%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/google-appengine-java?hl=en.
>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine for Java" group.
> To post to this group, send email to
> [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-appengine-java%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine-java?hl=en.
>
--
You received this message because you are subscribed to the Google Groups
"Google App Engine for Java" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-appengine-java?hl=en.