At first glance your code seems ok, The first place I would check is:

     if(numlocs<MaxSaveLocs){
                       addLocationToUser(pm2, omruserkey, location);
               } else {
                       msg = "You have exceeded the maximum number of
locations you
can save, please delete a location first.";
                       log.info("FAIL - Exceed max num locs");
               }

Also as a side note, this is redundant:

pm.newQuery(query).execute(user);

you should simply do query.execute(...)

Hope this helps,

Yaniv Kessler

maybe some locations exceed their MaxSaveLocs ???

On Mon, Jun 21, 2010 at 8:27 AM, shaz <ssh...@gmail.com> wrote:

>
> The problem is specifically with persisting objects in a many to one
> relationship. The odd thing is that the my code was working fine, and
> then suddenly it was only persisting the objects some of the time,
> completely non-deterministic and the code hadn't changed.  This has
> made it really hard to debug (it only happens sometimes and there is
> no exception, it just doesn't persist)
>
> For context, the app is a route optimization solver, and there is a
> user class called OmrUser, and there are Location and Driver classes
> that map to an OmrUser (Location3 and Driver are the class names).
> (Each User saves locations and drivers, and solves optimizations to
> route them). Many locations roll up to one user, and right now
> locations save only some of the time and it is getting worse.
>
> The odd thing is the Driver class persists fine, and the code is the
> same.
>
>
>
> Snippet of OmrUser class (userlocs is the list collection where
> Location3 objects are saved in the many to one mapping):
>
> @PersistenceCapable(identityType = IdentityType.APPLICATION,
> detachable = "true")
> public class OmrUser {
>    @PrimaryKey
>    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
>    private Key key;
>
>    @Persistent
>    private User gaeuser;
>
>    @Persistent(mappedBy = "omruser")
>    @Element(dependent = "true")
>    @Order(extensions = @Extension(vendorName="datanucleus", key=
> "list-ordering", value="key asc"))
>    private List<Location3> userlocs;
>
>    @Persistent(mappedBy = "omruser")
>    @Element(dependent = "true")
>    @Order(extensions = @Extension(vendorName="datanucleus", key=
> "list-ordering", value="key asc"))
>    private List<Driver> userdrivers;
>
> .....<rest cut>
>
>
> ******************************************************************************************************************************************************
>
> Snippet from Location3 class
>
> @PersistenceCapable(identityType = IdentityType.APPLICATION,
> detachable = "true")
> public class Location3 implements Comparable<Location3> {
>
>    @PrimaryKey
>    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
>    private Key key;
>
>    @Persistent
>    private User author;
>
>    @Persistent
>    private OmrUser omruser;
>
>    @Persistent
>    private String addressname;
>
> .....<rest cut>
>
>
>
> *****************************************************************************************************************************************************************
>
> Servlet that saves a location to a User
>
>
> public class SaveLoc extends HttpServlet {
>    private static final Logger log =
> Logger.getLogger(SaveLoc.class.getName());
>
>    public void doGet(HttpServletRequest request, HttpServletResponse
> response)
>                        throws IOException {
>        doPost(request, response);
>    }
>
>    public void doPost(HttpServletRequest req, HttpServletResponse
> resp)
>                throws IOException {
>        UserService userService = UserServiceFactory.getUserService();
>        User user = userService.getCurrentUser();
>        Integer MaxSaveLocs =
> Integer.parseInt(System.getProperty("opt.maxlocsave"));
>
>        String address = req.getParameter("addr");
>        String addressname = req.getParameter("addrname");
>        Double addresslat =
> Double.parseDouble(req.getParameter("lat"));
>        Double addresslon =
> Double.parseDouble(req.getParameter("lon"));
>        Double servicetime =
> Double.parseDouble(req.getParameter("servicetime"));
>        String msg = "";
>        List<OmrUser> omruserquery;
>        OmrUser thisomruser = null;
>        Date date = new Date();
>        Integer numlocs;
>        Key omruserkey;
>
>        PersistenceManager pm = PMF.get().getPersistenceManager();
>        Location3 location = new Location3(user, address, addressname,
> date, addresslat, addresslon, servicetime);
>        log.info("Attempting to Add Location - " +
> location.getAddressname());
>
>        try {
>                String select_query = "select from " +
> OmrUser.class.getName();
>                Query query = pm.newQuery(select_query);
>                query.setFilter("gaeuser == paramAuthor");
>                query.declareParameters("java.lang.String paramAuthor");
>                omruserquery = (List<OmrUser>)
> pm.newQuery(query).execute(user);
>
>                if(omruserquery.iterator().hasNext()) {
>                        thisomruser = omruserquery.iterator().next();
>                } else {
>                        thisomruser = CreateNewUser(user);
>                        pm.makePersistent(thisomruser);
>                }
>        } finally {
>                numlocs = thisomruser.getNumlocs();
>                omruserkey = thisomruser.getKey();
>                pm.close();
>        }
>
>
>        PersistenceManager pm2 =
> PMF.get().getPersistenceManager();
>        if(numlocs<MaxSaveLocs){
>                        addLocationToUser(pm2, omruserkey, location);
>                } else {
>                        msg = "You have exceeded the maximum number of
> locations you
> can save, please delete a location first.";
>                        log.info("FAIL - Exceed max num locs");
>                }
>            pm2.close();
>
>       if(msg == ""){
>           resp.sendRedirect("locations.jsp");
>       } else {
>           resp.sendRedirect("/err.jsp?msg=" + msg);
>       }
>
>    }
>
>    public void addLocationToUser(PersistenceManager pm2, Key UserKey,
> Location3 location) {
>                    pm2.currentTransaction().begin();
>                    try {
>                        OmrUser omruser = pm2.getObjectById(OmrUser.class,
> UserKey);
>                        omruser.getUserlocs().add(location);
>                        pm2.currentTransaction().commit();
>                    } finally {
>                        if (pm2.currentTransaction().isActive()) {
>                            pm2.currentTransaction().rollback();
>                        }
>                    }
>                }
>
>    public OmrUser CreateNewUser(User user) {
>        OmrUser newuser = new OmrUser(user, "Basic");
>        log.info("Created new user " + newuser.getGaeuser().getEmail());
>        return newuser;
>    }
>
> }
>
> --
> 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
> google-appengine-j...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
> .
> 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 google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to