JPA в Google App Engine: при вызове persist (...) всегда ли это происходит в транзакции?
В моей заявке я сохраняю сущность, у которой есть несколько не имеющих собственности детей.
Похоже, что вызов 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
Вызвано:
Явакс.стойкость.PersistenceException: незаконный аргумент в орг..datanucleus.прикладной программный интерфейс.СПД.NucleusJPAHelper.getJPAExceptionForNucleusException (NucleusJPAHelper.java: 298) около орг..datanucleus.прикладной программный интерфейс.СПД.JPAEntityManager.закрыть(JPAEntityManager.java: 197) около ком.образец.СПД.JpaServlet.догет (JpaServlet.Ява: 23) на класса javax.сервлет.http.Он полностью реализует интерфейс.сервис(он полностью реализует интерфейс.java: 617) на класса javax.сервлет.http.Он полностью реализует интерфейс.сервис(он полностью реализует интерфейс.java: 717) на орг..mortbay.пристань.сервлет.Сервлетхолдер.ручка (ServletHolder.java:511) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.java: 1166) около ком.гугл.appengine.прикладной программный интерфейс.разъем.разработка.DevSocketFilter.doFilter (Devsocket Filter.Ява: 74) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.ResponseRewriterFilter.doFilter (ResponseRewriterFilter.java: 123) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.Headerverification filter.doFilter (Headerverification Filter.Ява: 34) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.прикладной программный интерфейс.и blobstore.разработка.ServeBlobFilter.doFilter (ServeBlobFilter.Ява: 61) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.аппхостинг.utils.сервлет.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java: 43) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.StaticFileFilter.дофильтр (StaticFileFilter.java: 125) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.BackendServersFilter.doFilter (BackendServersFilter.java: 97) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около орг..mortbay.пристань.сервлет.Сервлетхандлер.ручка (ServletHandler.java: 388) около орг..mortbay.пристань.безопасность.SecurityHandler.ручка (SecurityHandler.java: 216) около орг..mortbay.пристань.сервлет.Сессионщик.ручка (SessionHandler.java: 182) около орг..mortbay.пристань.обработчик.Лентяй.ручка (ContextHandler.java: 765) около орг..mortbay.пристань.веб-приложение.WebAppContext.handle (WebAppContext.java: 418) около ком.гугл.appengine.инструменты.развитие.DevAppEngineWebAppContext.дескриптор (DevAppEngineWebAppContext.java: 94) около орг..mortbay.пристань.обработчик.Ручная обертка.ручка (HandlerWrapper.java: 152) около ком.гугл.appengine.инструменты.развитие.JettyContainerService$ApiProxyHandler.ручка (JettyContainerService.java: 409) около орг..mortbay.пристань.обработчик.Ручная обертка.ручка (HandlerWrapper.java: 152) в орг.mortbay.пристань.Сервер.handle (сервер.java: 326) на орг..mortbay.пристань.HttpConnection.handleRequest (HttpConnection.java: 542) около орг..mortbay.пристань.HttpConnection$RequestHandler.headerComplete (HttpConnection.java: 923) в орг.mortbay.пристань.HttpParser.parseNext (HttpParser.java: 547) на орг..mortbay.пристань.HttpParser.parseAvailable (HttpParser.java:212) на орг..mortbay.пристань.HttpConnection.handle (HttpConnection.java: 404) на орг.mortbay.Ио.НИО.SelectChannelEndPoint.запустить(SelectChannelEndPoint.Ява:409) около орг..mortbay.нитка.QueuedThreadPool$PoolThread.run (QueuedThreadPool.java: 582) Вызвано: Ява.яз..IllegalArgumentException: межгрупповая транзакция необходимо явно указать, см. Транзакционные операции.Строитель.withXGfound оба элемента { тип: "Отдел" id: 17 } и элемент { тип:" сотрудник " id: 18 }
На ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.DatastoreApiHelper.translateError (DatastoreApiHelper.Ява: 33) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.DatastoreApiHelper$1.convertException (DatastoreApiHelper.java: 70) около ком.гугл.appengine.прикладной программный интерфейс.utils.FutureWrapper.get (FutureWrapper.java: 94) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper$CumulativeAggregateFuture.получить (FutureHelper.java: 142) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper$TxnAwareFuture.получить (FutureHelper.java: 218) около ком.гугл.appengine.прикладной программный интерфейс.utils.FutureWrapper.get (FutureWrapper.Ява: 86) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper.getInternal (FutureHelper.Ява: 71) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper.quietGet (FutureHelper.java: 32) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.DatastoreServiceImpl.put (DatastoreServiceImpl.Ява: 85) около ком.гугл.appengine.datanucleus.WrappedDatastoreService.put (WrappedDatastoreService.java: 112) около ком.гугл.appengine.datanucleus.Entitutils.putEntitiesIntoDatastore (EntityUtils.java: 766) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal (DatastorePersistenceHandler.java: 314) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObject (DatastorePersistenceHandler.java: 218) около орг..datanucleus.государство.JDOStateManager.internalMakePersistent(JDOStateManager.java: 2381) около орг..datanucleus.государство.JDOStateManager.flush(JDOStateManager.java: 3778) около орг..datanucleus.магазин.типы.ШОС.Скауты.validateObjectForWriting (SCOUtils.Ява: 1518) около ком.гугл.appengine.datanucleus.скостор.AbstractFKStore.validateElementForWriting (AbstractFKStore.java: 396) около ком.гугл.appengine.datanucleus.скостор.Фклистстор.validateElementForWriting (FKListStore.java: 1036) около ком.гугл.appengine.datanucleus.скостор.Фклистстор.internalAdd (FKListStore.java: 195) около ком.гугл.appengine.datanucleus.скостор.Фклистстор.методы addall(FKListStore.java: 114) около орг..datanucleus.магазин.сопоставляются.отображение.CollectionMapping.postInsert (CollectionMapping.java: 134) около ком.гугл.appengine.datanucleus.StoreFieldManager.storeRelations (StoreFieldManager.java: 809) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal (DatastorePersistenceHandler.java: 367) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObject (DatastorePersistenceHandler.java: 218) около орг..datanucleus.государство.JDOStateManager.internalMakePersistent(JDOStateManager.java: 2381) около орг..datanucleus.государство.JDOStateManager.flush(JDOStateManager.java: 3778) около орг..datanucleus.ObjectManagerImpl.flushInternalWithOrdering (ObjectManagerImpl.java: 3888) около орг..datanucleus.ObjectManagerImpl.flushInternal (ObjectManagerImpl.java: 3811) около орг..datanucleus.ObjectManagerImpl.flush (ObjectManagerImpl.java: 3751) около орг..datanucleus.ObjectManagerImpl.preCommit (ObjectManagerImpl.java: 4141) около орг..datanucleus.ObjectManagerImpl.transactionPreCommit (ObjectManagerImpl.java: 428) около орг..datanucleus.TransactionImpl.internalPreCommit (TransactionImpl.java: 398) в орг.datanucleus.TransactionImpl.commit (TransactionImpl.java: 287) около орг..datanucleus.ObjectManagerImpl.закрыть (ObjectManagerImpl.java: 1090) около орг..datanucleus.прикладной программный интерфейс.СПД.JPAEntityManager.закрыть(JPAEntityManager.java: 193) ... Еще 36
Вызвано:
[6]}Java.яз..IllegalArgumentException: межгрупповая транзакция должна быть явно задано, см. раздел TransactionOptions.Строитель.withXGfound оба Элемент { type:" Department " id: 17 } и элемент { type: Идентификатор" сотрудника": 18 }На ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.DatastoreApiHelper.translateError (DatastoreApiHelper.Ява: 33) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.DatastoreApiHelper$1.convertException (DatastoreApiHelper.java: 70) около ком.гугл.appengine.прикладной программный интерфейс.utils.FutureWrapper.get (FutureWrapper.java: 94) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper$CumulativeAggregateFuture.получить (FutureHelper.java: 142) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper$TxnAwareFuture.получить (FutureHelper.java: 218) около ком.гугл.appengine.прикладной программный интерфейс.utils.FutureWrapper.get (FutureWrapper.Ява: 86) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper.getInternal (FutureHelper.Ява: 71) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.FutureHelper.quietGet (FutureHelper.java: 32) около ком.гугл.appengine.прикладной программный интерфейс.хранилище данных.DatastoreServiceImpl.put (DatastoreServiceImpl.Ява: 85) около ком.гугл.appengine.datanucleus.WrappedDatastoreService.put (WrappedDatastoreService.java: 112) около ком.гугл.appengine.datanucleus.Entitutils.putEntitiesIntoDatastore (EntityUtils.java: 766) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal (DatastorePersistenceHandler.java: 314) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObject (DatastorePersistenceHandler.java: 218) около орг..datanucleus.государство.JDOStateManager.internalMakePersistent(JDOStateManager.java: 2381) около орг..datanucleus.государство.JDOStateManager.flush(JDOStateManager.java: 3778) около орг..datanucleus.магазин.типы.ШОС.Скауты.validateObjectForWriting (SCOUtils.Ява: 1518) около ком.гугл.appengine.datanucleus.скостор.AbstractFKStore.validateElementForWriting (AbstractFKStore.java: 396) около ком.гугл.appengine.datanucleus.скостор.Фклистстор.validateElementForWriting (FKListStore.java: 1036) около ком.гугл.appengine.datanucleus.скостор.Фклистстор.internalAdd (FKListStore.java: 195) около ком.гугл.appengine.datanucleus.скостор.Фклистстор.методы addall(FKListStore.java: 114) около орг..datanucleus.магазин.сопоставляются.отображение.CollectionMapping.postInsert (CollectionMapping.java: 134) около ком.гугл.appengine.datanucleus.StoreFieldManager.storeRelations (StoreFieldManager.java: 809) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal (DatastorePersistenceHandler.java: 367) около ком.гугл.appengine.datanucleus.DatastorePersistenceHandler.insertObject (DatastorePersistenceHandler.java: 218) около орг..datanucleus.государство.JDOStateManager.internalMakePersistent(JDOStateManager.java: 2381) около орг..datanucleus.государство.JDOStateManager.flush(JDOStateManager.java: 3778) около орг..datanucleus.ObjectManagerImpl.flushInternalWithOrdering (ObjectManagerImpl.java: 3888) около орг..datanucleus.ObjectManagerImpl.flushInternal (ObjectManagerImpl.java: 3811) около орг..datanucleus.ObjectManagerImpl.flush (ObjectManagerImpl.java: 3751) около орг..datanucleus.ObjectManagerImpl.preCommit (ObjectManagerImpl.java: 4141) около орг..datanucleus.ObjectManagerImpl.transactionPreCommit (ObjectManagerImpl.java: 428) около орг..datanucleus.TransactionImpl.internalPreCommit (TransactionImpl.java: 398) в орг.datanucleus.TransactionImpl.commit (TransactionImpl.java: 287) около орг..datanucleus.ObjectManagerImpl.закрыть (ObjectManagerImpl.java: 1090) около орг..datanucleus.прикладной программный интерфейс.СПД.JPAEntityManager.закрыть(JPAEntityManager.java: 193) на ком.образец.СПД.JpaServlet.догет (JpaServlet.Ява: 23) на класса javax.сервлет.http.Он полностью реализует интерфейс.сервис(он полностью реализует интерфейс.java: 617) на класса javax.сервлет.http.Он полностью реализует интерфейс.сервис(он полностью реализует интерфейс.java: 717) на орг..mortbay.пристань.сервлет.Сервлетхолдер.ручка (ServletHolder.java:511) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.java: 1166) около ком.гугл.appengine.прикладной программный интерфейс.разъем.разработка.DevSocketFilter.doFilter (Devsocket Filter.Ява: 74) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.ResponseRewriterFilter.doFilter (ResponseRewriterFilter.java: 123) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.Headerverification filter.doFilter (Headerverification Filter.Ява: 34) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.прикладной программный интерфейс.и blobstore.разработка.ServeBlobFilter.doFilter (ServeBlobFilter.Ява: 61) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.аппхостинг.utils.сервлет.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java: 43) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.StaticFileFilter.дофильтр (StaticFileFilter.java: 125) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около ком.гугл.appengine.инструменты.развитие.BackendServersFilter.doFilter (BackendServersFilter.java: 97) около орг..mortbay.пристань.сервлет.ServletHandler$CachedChain.doFilter(ServletHandler.Ява: 1157) около орг..mortbay.пристань.сервлет.Сервлетхандлер.ручка (ServletHandler.java: 388) около орг..mortbay.пристань.безопасность.SecurityHandler.ручка (SecurityHandler.java: 216) около орг..mortbay.пристань.сервлет.Сессионщик.ручка (SessionHandler.java: 182) около орг..mortbay.пристань.обработчик.Лентяй.ручка (ContextHandler.java: 765) около орг..mortbay.пристань.веб-приложение.WebAppContext.handle (WebAppContext.java: 418) около ком.гугл.appengine.инструменты.развитие.DevAppEngineWebAppContext.дескриптор (DevAppEngineWebAppContext.java: 94) около орг..mortbay.пристань.обработчик.Ручная обертка.ручка (HandlerWrapper.java: 152) около ком.гугл.appengine.инструменты.развитие.JettyContainerService$ApiProxyHandler.ручка (JettyContainerService.java: 409) около орг..mortbay.пристань.обработчик.Ручная обертка.ручка (HandlerWrapper.java: 152) в орг.mortbay.пристань.Сервер.handle (сервер.java: 326) на орг..mortbay.пристань.HttpConnection.handleRequest (HttpConnection.java: 542) около орг..mortbay.пристань.HttpConnection$RequestHandler.headerComplete (HttpConnection.java: 923) в орг.mortbay.пристань.HttpParser.parseNext (HttpParser.java: 547) на орг..mortbay.пристань.HttpParser.parseAvailable (HttpParser.java:212) на орг..mortbay.пристань.HttpConnection.handle (HttpConnection.java: 404) на орг.mortbay.Ио.НИО.SelectChannelEndPoint.запустить(SelectChannelEndPoint.Ява:409) около орг..mortbay.нитка.QueuedThreadPool$PoolThread.run (QueuedThreadPool.java: 582)
persist
происходит внутри транзакции, хотя я не начал ее явно.
Вот соответствующие отладочные сообщения от DataNucleus:
08:38:17,587 DEBUG [DataNucleus.Стойкость] - ================= Конфигурация сохраняемости=============== 08:38:17,587 отладка [DataNucleus.Персистенция] - Фабрика Персистенции DataNucleus-Поставщик: Версия" DataNucleus": "3.1.3" 08: 38: 17.588 DEBUG [DataNucleus.Персистенция] - Фабрика Персистенции DataNucleus инициализации хранилищ данных URL-адрес="appengine" водитель="" имя="" 08: 38: 17,588 DEBUG [DataNucleus.Persistence] - JDK: 1.6.0_26 на Linux 08: 38: 17,588 DEBUG [DataNucleus.Persistence] - Persistence API: JPA 08: 38: 17,588 отладка [DataNucleus.Persistence] - Реестр Плагинов : орг..datanucleus.плагин.NonManagedPluginRegistry 08: 38: 17,588 DEBUG [DataNucleus.Персистентность] - персистентность-единица измерения: транзакции-необязательно 08: 38: 17,588 DEBUG [DataNucleus.Persistence] - Стандартные Параметры : pm-однопоточный, сохранять значения, нетранзакционный-читать, нетранзакционная запись, serverTimeZone=UTC 08: 38: 17,589 DEBUG [DataNucleus.Упорство] - сохранение варианты : отстегнуть на время deletion-policy=JDO2 08: 38: 17,589 DEBUG [DataNucleus.Стойкость] - Транзакции: тип = RESOURCE_LOCAL mode=оптимистичный изоляция=читать-совершено 08:38:17,589 отладки [DataNucleus.Стойкость] - Поколение стоимость : txn-изоляции=читать-совершенное соединение=новый 08:38:17,589 отладки [DataNucleus.Persistence] - загрузка классов: jdo 08: 38: 17.589 DEBUG [DataNucleus.Persistence] - кэш: Level1 (soft), Уровень2 (мягкий режим=неуточненная), QueryResults (мягкий), сборники/карты 08: 38: 17.589 DEBUG [DataNucleus.Стойкость] - =========================================================== 08:38:17,657 DEBUG [DataNucleus.Упорство] - Руководитель Объекта - орг.datanucleus.ObjectManagerImpl@e4eb585 " открыт для хранилища данных - ком.гугл.appengine.datanucleus.DatastoreManager@516f3619 " с txn= " орг.datanucleus.TransactionImpl@5c48cd13 " 08: 38: 17,688 отладка [DataNucleus.Упорство] - объект постоянных : - ком.образец.СПД.Отдел@55b7bf86 " 08: 38: 17,736 отладка [DataNucleus.Настойчивость] - Объект - ком.образец.СПД.Отдел@55b7bf86 " был отмечен за настойчивость но его фактическое сохранение в хранилище данных будет отложено из-за использования оптимистических сделок или " delayDatastoreOperationsUntilCommit" 08: 38: 17,741 DEBUG [DataNucleus.Настойчивость] - создание объекта настойчиво : "ком.образец.СПД.Сотрудник@95d0a50 " 08: 38: 17,742 отладка [DataNucleus.Настойчивость] - объект " com.образец.СПД.Сотрудник@95d0a50" был отмечен за настойчивость, но его фактическая настойчивость к хранилище данных будут отложены из-за использования оптимистичных сделок или "delayDatastoreOperationsUntilCommit" 08: 38: 17,747 DEBUG [DataNucleus.Transaction] - созданная транзакция [DataNucleus Транзакция, ID=Xid= 08: 38: 17,748 DEBUG [DataNucleus.Транзакция] - транзакция, начатая для Организация ObjectManager.datanucleus.ObjectManagerImpl@e4eb585 (оптимист=истина) 08: 38: 17,757 DEBUG [DataNucleus.Торговая операция] - Работает заручиться работы на ресурсе: ком.гугл.appengine.datanucleus.DatastoreXAResource@7d7082d8, ошибка код TMNOFLAGS и транзакции: [транзакция DataNucleus, ID=Xid= 08: 38: 18,024 DEBUG [DataNucleus.Транзакция] - запущенное хранилище данных транзакция: 0 08: 38: 18,026 DEBUG [DataNucleus.Торговая операция] - Совершение сделки по ObjectManager орг..datanucleus.ObjectManagerImpl@e4eb585 08: 38: 18,027 отладка [DataNucleus.Persistence] - ObjectManager.процесс internalFlush() начал использовать упорядоченный флеш - 2 грязных объекта 08: 38: 18,105 отладка [DataNucleus.Persistence] - управление сохраняемостью класса : ком.образец.СПД.Сотрудник [таблица: com.образец.СПД.Работник, InheritanceStrategy: new-table] 08: 38: 18,136 DEBUG [DataNucleus.Persistence] - управление сохраняемостью класса : ком.образец.СПД.Отдел [таблица: com.образец.СПД.Отдел, InheritanceStrategy: new-table] 08: 38: 18,316 DEBUG [DataNucleus.Настойчивость] - Поле - ком.образец.СПД.Отдел.сотрудники " упорствует для "каскад-упорствуй". 08: 38: 18.331 информация [DataNucleus.Стойкость] - Объект " com.образец.СПД.Отдел@55b7bf86 " имеет коллекцию - ком.образец.СПД.Отдел.сотрудники " пока элемент - ком.образец.СПД.Employee@95d0a50 " не имеет набора владельца. Управляющий отношение и установка собственника. 08: 38: 18,333 предупредить [DataNucleus.Метаданные] - предупреждение о метаданных для ком.образец.СПД.Работник.отдел: ошибка в метаданных для ком.образец.СПД.Работник.отдел: хранилище данных не поддерживает присоединяется и поэтому не может выполнять запросы на размещение связанных объектов в группа выборки по умолчанию. Поле будет доставлено лениво на первом доступ. Вы можете изменить это предупреждение, установив datanucleus.appengine.свойство ignorableMetaDataBehavior в вашем конфиг. Значение NONE заставит замолчать предупреждение. Значение ошибки превратит предупреждение в исключение. 08: 38: 18,354 отладка [DataNucleus.Persistence] - ObjectManager.процесс internalFlush() закончено 08: 38: 18,355 отладка [DataNucleus.Сделка] - Незаконная аргумент орг.datanucleus.исключения.NucleusFatalUserException: Незаконно аргумент
4 ответа:
Просто столкнулся с такой же проблемой и с уверенностью могу сказать, что транзакция совершается при вызове
EntityManager.close();
Вот некоторые доказательства из реализации DataNucleus JPA
Немного поздно, но я подумал, что это будет полезно для других. Я столкнулся с той же проблемой при использовании 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(); }
Вам нужно указать, что ваша транзакция является кросс-групповой транзакцией для jpa. прочитайте ниже документ специально кросс-групповая транзакция для jpa / jdo
Https://cloud.google.com/appengine/docs/java/datastore/transactions?csw=1
Для моего случая добавление ниже строки в Persistence.xml решил эту проблему.
<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>
Ясно из исключения
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)
Хранилище данных работает в (низкоуровневой) транзакции (также показанной в журнале), и оно требует, чтобы мульти-группы сущностей были включены, чтобы делать то, что вы хотите.