4

在我的应用程序中,我坚持一个具有许多无主子级的实体。

似乎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.

4

4 回答 4

2

刚遇到同样的问题,可以自信地说,当你打电话时事务已提交

EntityManager.close();

这是来自 DataNucleus JPA 实现的一些证明

于 2013-11-06T18:47:33.400 回答
2

有点晚了,但我认为这对其他人有用。在将 JPA 与 Google App Engine 一起使用时,我遇到了同样的问题。但是以下代码对我有用。希望能帮助到你-

try{
    EntityTransaction t = em.getTransaction();
    try{
        t.begin();
        //Do stuff
        em.persist(persistObject);
        t.commit();
    }finally {
        if (t.isActive())
            t.rollback();
    }
} finally {
    em.close();
}
于 2014-08-22T14:38:32.590 回答
1

您需要指定您的交易是 jpa 的跨组交易。阅读以下文件,特别是 jpa/jdo 的跨组交易

https://cloud.google.com/appengine/docs/java/datastore/transactions?csw=1

对于我的情况,在persistance.xml 中添加以下行解决了这个问题。

<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>
于 2015-01-01T18:17:40.830 回答
0

显然从异常

java.lang.IllegalArgumentException: cross-group transaction need to be explicitly specified, see TransactionOptions.Builder.withXGfound both Element { type: "Department" id: 17 } and Element { type: "Employee" id: 18 }

at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:33) 

数据存储在(低级)事务中运行(也显示在日志中),并且它需要启用多实体组才能在那里执行您想要的操作。

于 2013-04-19T15:10:07.430 回答