在我的应用程序中,我坚持一个具有许多无主子级的实体。
似乎persist
对持久化实体和所有子级的调用发生在事务内部,因为当我不启用跨组事务时出现错误(并且子级作为父实体生活在不同的实体组中)。
是否有可能以非交易方式进行持久化?
(如果需要此信息:我正在使用 Guice 将请求范围内的请求注入Provider<EntityManager>
到我的服务对象中。)
添加:
这是一个简单的测试用例:
@Entity public class Department {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
@Unowned
Collection<Employee> employees = new ArrayList<Employee>();
public Collection<Employee> getEmployees() {
return employees;
}
}
@Entity public class Employee {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private Department department; private String name;
public Employee(String name) { this.name = name; } public String getName() { return name; }
public void setName(String name) { this.name = name; } }
现在,当我这样做时:
EntityManager em = EMF.get().createEntityManager();
try {
Department department = new Department();
department.getEmployees().add(new Employee("Joe"));
em.persist(department);
} finally {
em.close();
}
我得到:
Illegal argument
造成的:
javax.persistence.PersistenceException:在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:197) 在 org.datanucleus.api.jpa.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:298) 的非法参数。 .jpa.JpaServlet.doGet(JpaServlet.java:23) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org. mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.api.socket.dev。 DevSocketFilter.doFilter(DevSocketFilter.java:74) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development。ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java: 34) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61) 在 org.mortbay .jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain .doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter。doFilter(StaticFileFilter.java:125) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security.SecurityHandler .handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org. mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:409) 在 org.mortbay.jetty .handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org. mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread。QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 原因:java.lang.IllegalArgumentException:需要明确指定跨组事务,请参阅 TransactionOptions.Builder.withXG 找到 Element { type: "Department" id: 17 } 和元素{类型:“员工”ID:18}
在 com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:70) 在 com.google.appengine 的 com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:33)。 com.google.appengine.api.datastore.FutureHelper$CumulativeAggregateFuture.get(FutureHelper.java:142) com.google.appengine.api.datastore.FutureHelper$ 上的 api.utils.FutureWrapper.get(FutureWrapper.java:94) TxnAwareFuture.get(FutureHelper.java:218) 在 com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:86) 在 com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java: 71) 在 com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32) 在 com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:85) 在 com.google.appengine.datanucleus.WrappedDatastoreService.put(WrappedDatastoreService.java:112) 在 com.google.appengine.datanucleus.EntityUtils.putEntitiesIntoDatastore(EntityUtils.java:766) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler .insertObjectsInternal(DatastorePersistenceHandler.java:314) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:218) 在 org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2381) 在 org.datanucleus。 state.JDOStateManager.flush(JDOStateManager.java:3778) 在 org.datanucleus.store.types.sco.SCOUtils.validateObjectForWriting(SCOUtils.java:1518) 在 com.google.appengine.datanucleus.scostore.AbstractFKStore.validateElementForWriting(AbstractFKStore.爪哇:396) 在 com.google.appengine.datanucleus.scostore.FKListStore.internalAdd(FKListStore.java:195) 在 com.google.appengine 的 com.google.appengine.datanucleus.scostore.FKListStore.validateElementForWriting(FKListStore.java:1036) .datanucleus.scostore.FKListStore.addAll(FKListStore.java:114) 在 org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert(CollectionMapping.java:134) 在 com.google.appengine.datanucleus.StoreFieldManager.storeRelations(StoreFieldManager .java:809) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal(DatastorePersistenceHandler.java:367) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:218) 在 org.datanucleus.state。 JDOStateManager.internalMakePersistent(JDOStateManager.java:2381) 在 org.datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3778) 在 org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) 在 org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) 在org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751) at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) at org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) at org.datanucleus.TransactionImpl .internalPreCommit(TransactionImpl.java:398) 在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager。关闭(JPAEntityManager.java:193)... 36 更多还有 36 个还有 36 个还有 36 个还有 36 个datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3778) at org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) at org.datanucleus.ObjectManagerImpl .flush(ObjectManagerImpl.java:3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在 org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl. java:398) 在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java :193) ... 36 更多datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3778) at org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) at org.datanucleus.ObjectManagerImpl .flush(ObjectManagerImpl.java:3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在 org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl. java:398) 在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java :193) ... 36 更多JDOStateManager.flush(JDOStateManager.java:3778) at org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl .java:3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在 org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398)在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) 。 .. 还有 36 个JDOStateManager.flush(JDOStateManager.java:3778) at org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl .java:3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在 org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398)在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) 。 .. 还有 36 个3778) 在 org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) 在 org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) 在 org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751) 在 org. datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) at org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398) at org.datanucleus.TransactionImpl.commit (TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 还有 36 个3778) 在 org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) 在 org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) 在 org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751) 在 org. datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) at org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398) at org.datanucleus.TransactionImpl.commit (TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 还有 36 个java:3888) 在 org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) 在 org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398) 在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl .close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 36 更多java:3888) 在 org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) 在 org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398) 在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl .close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 36 更多3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在 org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398) 在 org. datanucleus.TransactionImpl.commit(TransactionImpl.java:287) at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) at org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 36更多的3751) 在 org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) 在 org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) 在 org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398) 在 org. datanucleus.TransactionImpl.commit(TransactionImpl.java:287) at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) at org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 36更多的datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 36 更多datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193) ... 36 更多
造成的:
java.lang.IllegalArgumentException:需要显式指定跨组事务,请参阅 TransactionOptions.Builder.withXG 发现 Element { type: "Department" id: 17 } 和 Element { type: "Employee" id: 18 }
在 com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:70) 在 com.google.appengine 的 com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:33)。 com.google.appengine.api.datastore.FutureHelper$CumulativeAggregateFuture.get(FutureHelper.java:142) com.google.appengine.api.datastore.FutureHelper$ 上的 api.utils.FutureWrapper.get(FutureWrapper.java:94) TxnAwareFuture.get(FutureHelper.java:218) 在 com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:86) 在 com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java: 71) 在 com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32) 在 com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:85) 在 com.google.appengine.datanucleus.WrappedDatastoreService.put(WrappedDatastoreService.java:112) 在 com.google.appengine.datanucleus.EntityUtils.putEntitiesIntoDatastore(EntityUtils.java:766) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler .insertObjectsInternal(DatastorePersistenceHandler.java:314) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:218) 在 org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2381) 在 org.datanucleus。 state.JDOStateManager.flush(JDOStateManager.java:3778) 在 org.datanucleus.store.types.sco.SCOUtils.validateObjectForWriting(SCOUtils.java:1518) 在 com.google.appengine.datanucleus.scostore.AbstractFKStore.validateElementForWriting(AbstractFKStore.爪哇:396) 在 com.google.appengine.datanucleus.scostore.FKListStore.internalAdd(FKListStore.java:195) 在 com.google.appengine 的 com.google.appengine.datanucleus.scostore.FKListStore.validateElementForWriting(FKListStore.java:1036) .datanucleus.scostore.FKListStore.addAll(FKListStore.java:114) 在 org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert(CollectionMapping.java:134) 在 com.google.appengine.datanucleus.StoreFieldManager.storeRelations(StoreFieldManager .java:809) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal(DatastorePersistenceHandler.java:367) 在 com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:218) 在 org.datanucleus.state。 JDOStateManager.internalMakePersistent(JDOStateManager.java:2381) 在 org.datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3778) 在 org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888) 在 org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811) 在org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751) at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141) at org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428) at org.datanucleus.TransactionImpl .internalPreCommit(TransactionImpl.java:398) 在 org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287) 在 org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090) 在 org.datanucleus.api.jpa.JPAEntityManager。在 com.example 处关闭(JPAEntityManager.java:193)。jpa.JpaServlet.doGet(JpaServlet.java:23) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.mortbay .jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.api.socket.dev.DevSocketFilter .doFilter(DevSocketFilter.java:74) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123 ) 在 com.google.appengine.tools.development.HeaderVerificationFilter 的 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)。doFilter(HeaderVerificationFilter.java:34) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java: 61) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty .servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1157) 在 com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security .SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94) 在 org.mortbay.jetty.handler.HandlerWrapper。 org.mortbay 的 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:409) 的句柄(HandlerWrapper.java:152)。jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org .mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212 ) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run( QueuedThreadPool.java:582)java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 在 org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:212) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread。 QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547) 在 org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:212) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread。 QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 运行(SelectChannelEndPoint.java:409)在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 运行(SelectChannelEndPoint.java:409)
这就是为什么我一直认为这persist
会发生在交易中,尽管我还没有明确地开始交易。
以下是来自 DataNucleus 的相关调试消息:
ObjectManagerImpl@e4eb585 08:38:18,027 调试 [DataNucleus.Persistence] - ObjectManager.internalFlush() 进程开始使用有序刷新 - 2 个脏对象 08:38:18,105 调试 [DataNucleus.Persistence] - 管理类的持久性:com.example。 jpa.Employee [表:com.example.jpa.Employee,InheritanceStrategy:new-table] 08:38:18,136 调试 [DataNucleus.Persistence] - 管理类的持久性:com.example.jpa.Department [表:com.example .jpa.Department, InheritanceStrategy : new-table] 08:38:18,316 DEBUG [DataNucleus.Persistence] - 字段“com.example.jpa.Department.employees”正在为“cascade-persist”保留。08:38:18,331 INFO [DataNucleus.Persistence] - 对象“com.example.jpa.Department@55b7bf86”有一个集合“com.example.jpa.Department.employees” 然而元素“com.example.jpa.Employee@95d0a50”没有所有者集。管理关系并设置所有者。08:38:18,333 WARN [DataNucleus.MetaData] - com.example.jpa.Employee.department 的元数据警告:com.example.jpa.Employee.department 的元数据错误:数据存储不支持连接和因此不能接受将相关对象放在默认提取组中的请求。该字段将在首次访问时延迟获取。您可以通过在配置中设置 datanucleus.appengine.ignorableMetaDataBehavior 属性来修改此警告。NONE 值将使警告静音。ERROR 值会将警告转换为异常。08:38:18,354 DEBUG [DataNucleus.Persistence] - ObjectManager.internalFlush() 进程完成 08:38:18,355 DEBUG [DataNucleus.