You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Piotr Kubowicz (JIRA)" <ji...@apache.org> on 2013/02/27 11:03:12 UTC
[jira] [Created] (OPENJPA-2340) UnsupportedOperationException on
commit/rollback a transaction without writes
Piotr Kubowicz created OPENJPA-2340:
---------------------------------------
Summary: UnsupportedOperationException on commit/rollback a transaction without writes
Key: OPENJPA-2340
URL: https://issues.apache.org/jira/browse/OPENJPA-2340
Project: OpenJPA
Issue Type: Bug
Components: kernel
Affects Versions: 2.2.1
Reporter: Piotr Kubowicz
Attachments: BrokerImpl-trans-cache.patch
I met the following exception:
Caused by: <openjpa-2.2.1-r422266:1396819 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: IteratorChains must contain at least one Iterator
at org.apache.openjpa.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:2036)
at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:94)
at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1516)
at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933)
at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570)
... 37 more
Caused by: java.lang.UnsupportedOperationException: IteratorChains must contain at least one Iterator
at org.apache.commons.collections.iterators.IteratorChain.checkChainIntegrity(Unknown Source)
at org.apache.commons.collections.iterators.IteratorChain.lockChain(Unknown Source)
at org.apache.commons.collections.iterators.IteratorChain.hasNext(Unknown Source)
at org.apache.openjpa.kernel.BrokerImpl.endTransaction(BrokerImpl.java:2407)
at org.apache.openjpa.kernel.BrokerImpl.afterCompletion(BrokerImpl.java:2012)
... 41 more
It's hard for me to provide a minimal reproduction steps. Generally what I am doing is:
manager.getTransaction().begin();
// save some entities joined in a complex way
manager.getTransaction().commit(); // fine
manager.clear();
manager.getTransaction().begin();
manager.getTransaction().rollback(); // throws exception
What is funny, I have an @After method in my test that does another:
manager.getTransaction().rollback();
and it succeeds.
After some debugging I found that the bug is in how BrokerImpl.endTransaction() initializes transStates:
- in the rollback that throws exceptions, hasTransactionalObjects() returns true, although _transCache.size() returns 0; iterator returned by the empty _transCache throws UnsupportedOperationException
- in the rollback in @After, hasTransactionalObjects() returns false, transStates is initialized with Collections.EMPTY_SET and there is no problem with the iterator
I attached a patch which makes hasTransactionalObjects() check not only if _transCache is null, but also if its empty.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira