I am having the same problem with updating a serialized array...

I wonder if anyone reading this is smart enough help figure out a
solution?

-Cory

On Sep 6, 4:00 pm, Jeff <[email protected]> wrote:
> Am I doing these JDO operations wrong or is there a bug/limitation in
> the appengine JDO implementation?
>
> Using JDO, I can persist new entities in the datastore that contain a
> serialized collection and read them back.  But when I attempt to
> update an existing entity, it persists the changes to all properties
> except the serialized collection.  Is there some way I'm supposed to
> indicate that the serialized collection has changed and therefore
> needs to be persisted?
>
> Here is some test code that demonstrates the problem.  Relevant output
> follows the code.
>
> @PersistenceCapable(identityType = IdentityType.APPLICATION)
> public class SerialTest2
> {
>     @SuppressWarnings("unused")
>     @PrimaryKey
>     @Persistent
>     private String key;
>     @Persistent
>     private String testString;
>     @Serialized
>     ArrayList<String> testStrings;
>
>     public SerialTest2()
>     {
>     }
>
>     public void setKey(String key)
>     {
>         this.key = key;
>     }
>     public void setTestString(String testString)
>     {
>         if (testStrings == null)
>         {
>             testStrings = new ArrayList<String>();
>         }
>         this.testString = testString;
>         this.testStrings.add(testString);
>     }
>
>     public String getTestString()
>     {
>         return this.testString;
>     }
>
>     public ArrayList<String> getTestStrings()
>     {
>         return this.testStrings;
>     }
>
> }
>
>         log.info("Insert/Update
> ------------------------------------");
>         List<SerialTest2> st2List = null;
>         PersistenceManager pm = PMF.get().getPersistenceManager();
>         pm.currentTransaction().begin();
>         try
>         {
>             StringBuilder sb = new StringBuilder();
>             sb.append("select from ");
>             sb.append(SerialTest2.class.getName());
>             sb.append(" where key == 'A123'");
>             st2List = (List<SerialTest2>) pm.newQuery(sb.toString
> ()).execute();
>             if (st2List == null || st2List.size() < 1)
>             {
>                 log.info("No existing record found");
>                 SerialTest2 st2 = new SerialTest2();
>                 st2.setKey("A123");
>                 st2.setTestString("First Test String");
>                 pm.makePersistent(st2);
>             }
>             else
>             {
>                 log.info("Found existing record");
>                 log.info("--testString: " + st2List.get
> (0).getTestString());
>                 ArrayList<String> testStrings = st2List.get
> (0).getTestStrings();
>                 for (String s: testStrings)
>                 {
>                     log.info("--testStrings: " + s);
>                 }
>                 st2List.get(0).setTestString("Second Test String");
>
>                 log.info("Updated record ready to persist");
>                 log.info("--testString: " + st2List.get
> (0).getTestString());
>                 testStrings = st2List.get(0).getTestStrings();
>                 for (String s: testStrings)
>                 {
>                     log.info("--testStrings: " + s);
>                 }
>
>                 pm.makePersistentAll(st2List);
>             }
>             pm.currentTransaction().commit();
>         }
>         catch (javax.jdo.JDOObjectNotFoundException e)
>         {
>             log.info("Threw JDOObjectNotFoundException");
>         }
>         catch (Exception e)
>         {
>             StringWriter sw = new StringWriter();
>             e.printStackTrace(new PrintWriter(sw));
>             log.severe("Error during insert/update step: " +
> sw.toString());
>         }
>         finally
>         {
>             if (pm.currentTransaction().isActive())
>             {
>                 pm.currentTransaction().rollback();
>             }
>             pm.close();
>         }
>
>         log.info("Query
> --------------------------------------------");
>
>         pm = PMF.get().getPersistenceManager();
>         try
>         {
>             StringBuilder sb = new StringBuilder();
>             sb.append("select from ");
>             sb.append(SerialTest2.class.getName());
>             sb.append(" where key == 'A123'");
>             st2List = (List<SerialTest2>) pm.newQuery(sb.toString
> ()).execute();
>             if (st2List == null || st2List.size() < 1)
>             {
>                 log.info("No existing record found");
>             }
>             else
>             {
>                 log.info("Found existing record");
>                 log.info("--testString: " + st2List.get
> (0).getTestString());
>                 ArrayList<String> testStrings = st2List.get
> (0).getTestStrings();
>                 for (String s: testStrings)
>                 {
>                     log.info("--testStrings: " + s);
>                 }
>             }
>         }
>         catch (javax.jdo.JDOObjectNotFoundException e)
>         {
>             log.info("Threw JDOObjectNotFoundException");
>         }
>         catch (Exception e)
>         {
>             StringWriter sw = new StringWriter();
>             e.printStackTrace(new PrintWriter(sw));
>             log.severe("Error during query step: " + sw.toString());
>         }
>         finally
>         {
>             pm.close();
>         }
>
> First run (when it creates a new datastore entity):
>
> INFO: Insert/Update ------------------------------------
> INFO: No existing record found
> INFO: Query --------------------------------------------
> INFO: Found existing record
> INFO: --testString: First Test String
> INFO: --testStrings: First Test String
>
> Second run (when it updates the entity):
>
> INFO: Insert/Update ------------------------------------
> INFO: Found existing record
> INFO: --testString: First Test String
> INFO: --testStrings: First Test String
> INFO: Updated record ready to persist
> INFO: --testString: Second Test String
> INFO: --testStrings: First Test String
> INFO: --testStrings: Second Test String
> INFO: Query --------------------------------------------
> INFO: Found existing record
> INFO: --testString: Second Test String
> INFO: --testStrings: First Test String
>
> Note that the query returned an entity with "testString" updated, but
> "testStrings" still contains only one item--in other words it was not
> updated.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" 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?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to