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.


Reply via email to