Java 如何在AppEngine中使用JPA2获取实体、在GWT中更新和保存?

Java 如何在AppEngine中使用JPA2获取实体、在GWT中更新和保存?,java,google-app-engine,gwt,jpa,datanucleus,Java,Google App Engine,Gwt,Jpa,Datanucleus,在更新GWT中的一些实体之后,我想保存它们。但是,当我试图持久化它们时,当我查看AppEngine管理界面时,它不会保存。布尔值没有改变 密码 使用事务更新 还是没救。没有抛出异常 日志 OnixUser实体的应用程序引擎管理界面 最高级原木 如果在使用事务的情况下,您的数据没有被持久化,那么最好的方法是尝试记录日志,看看下面发生了什么。当您使用DataNucleus作为持久性提供程序时,可以参考此配置 SQL日志记录。与您相关的信息在页面末尾附近给出。我没有使用GWT,但您的代码没有使用em

在更新GWT中的一些实体之后,我想保存它们。但是,当我试图持久化它们时,当我查看AppEngine管理界面时,它不会保存。布尔值没有改变

密码 使用事务更新 还是没救。没有抛出异常

日志 OnixUser实体的应用程序引擎管理界面

最高级原木
如果在使用事务的情况下,您的数据没有被持久化,那么最好的方法是尝试记录日志,看看下面发生了什么。当您使用DataNucleus作为持久性提供程序时,可以参考此配置
SQL日志记录。与您相关的信息在页面末尾附近给出。

我没有使用GWT,但您的代码没有使用em.getTransaction().begin()和em.getTransaction().commit()启动/提交事务。如果没有事务,实体管理器不会根据JPA规范对数据库进行任何更改。@Shailendra我认为这是可选的,但我添加了事务,当通过管理界面查看或重新加载页面时,它仍然没有保存。您不需要调用来持久化,因为“merged”所指的对象将被管理,任何进一步的更改将在事务提交时自动保留。您可以启用sql日志记录,以查看此操作是否确实生成了sql。@Shailendra我尝试了使用.persist()和不使用.persist(),并在这两者之间重新启动了服务器。如何打开SQL日志记录?您为JPA使用哪个持久性提供程序?好的,我修改了WEB-INF/logging.properties并重新启动了服务器,但它没有打印任何其他信息:好的,我必须停止并启动服务器,而不仅仅是重新加载。使用了
.level=FINEST
DataNucleus.level=FINEST
,它产生了以下日志:您可以发布相关persistence.xml吗。我想看到的是事务类型是JTA还是RESOURCE_LOCAL。如果是前者,那么您可能需要注入实体管理器,而不是创建自己。用户正在使用GAE。没有这样的SQL。显然,GAEs插件JPA确实在调试级别打印了很多日志信息,包括数据存储的所有输入。然后看起来我误解了环境。
    EntityManager em = EMF.get().createEntityManager();
    for (OnixUser s: admin) {
        log.info(s.email + ", " + s.isAdmin);
        em.merge(s);  
    }
    em.close();
    EntityManager em = EMF.get().createEntityManager();
    em.getTransaction().begin();
    for (OnixUser s: admin) {
        log.info(s.email + ", " + s.isAdmin);
        OnixUser merged = em.merge(s);
        em.persist(merged);
//          em.persist(s);
    }
    em.getTransaction().commit();
    em.close();
 Oct 16, 2013 3:19:10 PM com.example.sdm.server.SDMServiceImpl setAdmin
 INFO: chloe@example.com, true
FINE: Created ManagedConnection using DatastoreService = com.google.appengine.api.datastore.DatastoreServiceImpl@2fd9270d
Oct 16, 2013 4:03:14 PM org.datanucleus.store.connection.ConnectionManagerImpl allocateConnection
FINE: Connection added to the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@31c1f89d for key=org.datanucleus.ObjectManagerImpl@6977c57b in factory=ConnectionFactory:tx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@2b1f5f6b]
Oct 16, 2013 4:03:14 PM com.example.sdm.server.SDMServiceImpl setAdmin
INFO: chloe@example.com, true
Oct 16, 2013 4:03:14 PM org.datanucleus.state.LifeCycleState changeState
FINE: Object "com.example.sdm.shared.OnixUser@48ef6e99" (id="com.example.sdm.shared.OnixUser:6456332278300672") has a lifecycle change : "P_CLEAN"->"P_NONTRANS"
Oct 16, 2013 4:03:14 PM org.datanucleus.store.connection.ConnectionManagerImpl$1 managedConnectionPostClose
FINE: Connection removed from the pool : com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl$DatastoreManagedConnection@31c1f89d for key=org.datanucleus.ObjectManagerImpl@6977c57b in factory=ConnectionFactory:tx[com.google.appengine.datanucleus.DatastoreConnectionFactoryImpl@2b1f5f6b]
Oct 16, 2013 4:03:14 PM org.datanucleus.state.LifeCycleState changeState
FINE: Object "com.example.sdm.shared.OnixUser@48ef6e99" (id="com.example.sdm.shared.OnixUser:6456332278300672") has a lifecycle change : "P_NONTRANS"->"DETACHED_CLEAN"
Oct 16, 2013 4:03:14 PM com.google.apphosting.utils.jetty.AppEngineAuthentication$AppEngineUserRealm disassociate
FINE: Ignoring disassociate call for: chloe@example.com