[appengine-java] Re: lost sub entity
Hi, I finally found a solution like this: list.add(first.copy()); where copy creates a new SubEntity and copies all fields except the key to the new instance. Do you regard this as a bug? Gunnar On 2 mar, 20:28, Gunnar gunnar@gmail.com wrote: I've uploaded my app to google with the same result, so it's not a problem with Eclipse or sdk version. Gunnar On 1 mar, 20:59, John Patterson jdpatter...@gmail.com wrote: http://lmgtfy.com/?q=appengine+jdo+%22default+fetch+group%22 On 2 Mar 2010, at 02:50, Gunnar wrote: I don't jnow what you mean with look into default fetch group!. Please explain. Gunnar On 1 mar, 19:20, John Patterson jdpatter...@gmail.com wrote: Did you look into default fetch group? On 2 Mar 2010, at 01:04, Gunnar wrote: Hi, I followed Jakes advice to do e.setList(list) but no change. I've also stepped through my code, but there is no exception! Btw I use version 1.3.1 of the SDK. Gunnar On 1 mar, 15:28, John Patterson jdpatter...@gmail.com wrote: It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet {
[appengine-java] Re: lost sub entity
I've uploaded my app to google with the same result, so it's not a problem with Eclipse or sdk version. Gunnar On 1 mar, 20:59, John Patterson jdpatter...@gmail.com wrote: http://lmgtfy.com/?q=appengine+jdo+%22default+fetch+group%22 On 2 Mar 2010, at 02:50, Gunnar wrote: I don't jnow what you mean with look into default fetch group!. Please explain. Gunnar On 1 mar, 19:20, John Patterson jdpatter...@gmail.com wrote: Did you look into default fetch group? On 2 Mar 2010, at 01:04, Gunnar wrote: Hi, I followed Jakes advice to do e.setList(list) but no change. I've also stepped through my code, but there is no exception! Btw I use version 1.3.1 of the SDK. Gunnar On 1 mar, 15:28, John Patterson jdpatter...@gmail.com wrote: It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { �...@suppresswarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try {
[appengine-java] Re: lost sub entity
If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { �...@suppresswarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } } } catch (Exception e) { e.printStackTrace(); } finally { if (tx.isActive()) tx.rollback(); query.closeAll(); pm.close(); }
Re: [appengine-java] Re: lost sub entity
It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { @SuppressWarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } } } catch (Exception e) { e.printStackTrace(); } finally { if (tx.isActive())
[appengine-java] Re: lost sub entity
Hi, I followed Jakes advice to do e.setList(list) but no change. I've also stepped through my code, but there is no exception! Btw I use version 1.3.1 of the SDK. Gunnar On 1 mar, 15:28, John Patterson jdpatter...@gmail.com wrote: It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { �...@suppresswarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first);
[appengine-java] Re: lost sub entity
Hi, I have not defined any fetch group, should I? If so how should I do that? Gunnar On 1 mar, 15:28, John Patterson jdpatter...@gmail.com wrote: It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { �...@suppresswarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); }
Re: [appengine-java] Re: lost sub entity
Did you look into default fetch group? On 2 Mar 2010, at 01:04, Gunnar wrote: Hi, I followed Jakes advice to do e.setList(list) but no change. I've also stepped through my code, but there is no exception! Btw I use version 1.3.1 of the SDK. Gunnar On 1 mar, 15:28, John Patterson jdpatter...@gmail.com wrote: It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { @SuppressWarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list);
[appengine-java] Re: lost sub entity
I don't jnow what you mean with look into default fetch group!. Please explain. Gunnar On 1 mar, 19:20, John Patterson jdpatter...@gmail.com wrote: Did you look into default fetch group? On 2 Mar 2010, at 01:04, Gunnar wrote: Hi, I followed Jakes advice to do e.setList(list) but no change. I've also stepped through my code, but there is no exception! Btw I use version 1.3.1 of the SDK. Gunnar On 1 mar, 15:28, John Patterson jdpatter...@gmail.com wrote: It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { �...@suppresswarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList();
Re: [appengine-java] Re: lost sub entity
http://lmgtfy.com/?q=appengine+jdo+%22default+fetch+group%22 On 2 Mar 2010, at 02:50, Gunnar wrote: I don't jnow what you mean with look into default fetch group!. Please explain. Gunnar On 1 mar, 19:20, John Patterson jdpatter...@gmail.com wrote: Did you look into default fetch group? On 2 Mar 2010, at 01:04, Gunnar wrote: Hi, I followed Jakes advice to do e.setList(list) but no change. I've also stepped through my code, but there is no exception! Btw I use version 1.3.1 of the SDK. Gunnar On 1 mar, 15:28, John Patterson jdpatter...@gmail.com wrote: It is unusual that you see no stack trace. Are you sure you are not catching it? You could step through the code line by line to see what happens after the line with the problem. Could this be something to do with setting the fetch group to default? That seems to be the problem with a lot of peoples JDO code :) On 1 Mar 2010, at 21:19, Jake wrote: If I recall, JDO is picky when it comes to being aware of changes made to a persisted object. For example, changing fields directly (object.field = newValue;) doesn't work - you need to use a getter/ setter (object.setField(newValue);). Perhaps you are encountering the same issue here? Does the following type of thing work? LIstSubEntity list = e.getMyList(); SubEntity first = list.remove(0); list.add(first); e.setMyList(list); pm.makePersistent(e); tx.commit(); Jake On Feb 28, 11:05 am, Gunnar gunnar@gmail.com wrote: Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { @SuppressWarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0);
[appengine-java] Re: lost sub entity
Hi, John and Karel, you are right about the placement of the commit statement. It worked in the test example because I only had one instance of MyEntity. I don't get any exception at all in the Eclipse console! When I add a second instance of MyEntity if fails with Transaction is not active as expected. Now I've changed the code in the try statement like this, but still the first sub entity is lost and no exception is thrown! (Of cause it would fail it the list is empty.) ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { tx.begin(); MyEntity e = results.iterator().next(); ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } On 28 Feb, 02:51, John Patterson jdpatter...@gmail.com wrote: This should be throwing an exception. The JavaDocs for Transaction.commit() say Commits the transaction. Whether this call succeeds or fails, all subsequent method invocations on this object will throw IllegalStateException. When something does not work as you expect the first place to look is the logs under your application console. On 28 Feb 2010, at 05:25, Karel Alvarez wrote: dont you get any exceptions stacktrace in the server console? it would help... also you are calling commit() inside the for loop, although the transactions is started only once... that would crash in the second iteration in a normal db server, I am not sure what GAE does with it, in any case I dont think it is what you intended... On Sat, Feb 27, 2010 at 2:52 PM, Gunnar gunnar@gmail.com wrote: Hi, I have problem with reordering a List. I created a test with an entity called MyEntity which have a ListSubEntity. First I persist one instance of MyEntity with a list containing 3 SubEntity. This works fine. Then I call a reorder servlet that moves the first SubEntity to the last position in the list. The result is that the first SubEntity is lost and the datastore only contains 2 SubEntity instances. What can be wrong? Here is the reorder code: package com.google.appengine.demo; import java.io.IOException; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings(serial) public class ReorderServlet extends HttpServlet { �...@suppresswarnings(unchecked) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(MyEntity.class); Transaction tx = pm.currentTransaction(); try { tx.begin(); ListMyEntity results = (ListMyEntity) query.execute(); if (results.iterator().hasNext()) { for (MyEntity e : results) { ListSubEntity list = e.getMyList(); SubEntity first = list.remove(0); boolean ok = list.add(first); if (!ok) { System.err.println(could not add first); } System.out.println(list); pm.makePersistent(e); tx.commit(); } } } catch (Exception e) { e.printStackTrace(); } finally { if (tx.isActive()) tx.rollback(); query.closeAll(); pm.close(); } resp.setContentType(text/plain); resp.getWriter().println(reordered); } } -- 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-java@googlegroups.com . To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com . For more options, visit this group athttp://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