I gave up and I am adding a surrogate PK and a unique clause to ensure the old composite PK will remain. Now it works. Gonna try to create a separate eclipse project just to reproduce this bug later.
thanks Leo [] Leo On Thu, Nov 21, 2013 at 8:17 PM, Leonardo K. Shikida <shik...@gmail.com>wrote: > One curious thing > > If I change to > > public void addUserGroupAccess(UserGroupAccess userGroupAccess) { > Application app = > this.baseService.getApplicationDAO().find(userGroupAccess.getPk().getApplicationId()); > userGroupAccess.setApplication(app); > > SecurityLevel seclevel = > this.baseService.getSecurityLevelDAO().find(userGroupAccess.getPk().getSecurityLevelId()); > userGroupAccess.setSecurityLevel(seclevel); > > User usr = > this.baseService.getUserDAO().find(userGroupAccess.getPk().getUserId()); > userGroupAccess.setUser(usr); > > this.baseService.getUserGroupAccessDAO().add(userGroupAccess); > > } > > > then it seems to work... > > > 26126 poc TRACE [main] openjpa.Runtime - Found datasource1: datasource > 1045888352 from configuration. StoreContext: > org.apache.openjpa.kernel.BrokerImpl@6f29660b > 26126 poc TRACE [main] openjpa.Runtime - > org.apache.openjpa.persistence.EntityManagerFactoryImpl@3693dbd1 created > EntityManager org.apache.openjpa.persistence.EntityManagerImpl@6f29660b. > 26127 poc TRACE [main] openjpa.jdbc.SQLDiag - getInitializeStateResult: > oid=201 class com.xyz.wwwww.tomee.entity.Application > 26128 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > executing prepstmnt 116036913 SELECT t0.active, t0.description FROM > Application t0 WHERE t0.id = ? [params=?] > 26131 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > [3 ms] spent > 26134 poc TRACE [main] openjpa.jdbc.JDBC - <t 346652520, conn > 804578842> [0 ms] close > 26135 poc TRACE [main] openjpa.jdbc.SQLDiag - getInitializeStateResult: > oid=251 class com.xyz.wwwww.tomee.entity.SecurityLevel > 26136 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > executing prepstmnt 537118814 SELECT t0.active, t0.description FROM > SecurityLevel t0 WHERE t0.id = ? [params=?] > 26139 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > [3 ms] spent > 26140 poc TRACE [main] openjpa.jdbc.JDBC - <t 346652520, conn > 804578842> [0 ms] close > 26141 poc TRACE [main] openjpa.jdbc.SQLDiag - getInitializeStateResult: > oid=301 class com.xyz.wwwww.tomee.entity.User > 26142 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > executing prepstmnt 1482138557 SELECT t0.active, t0.creation, > t0.emailAddress, t0.firstName, t0.lastAccess, t0.lastName, > t0.middleInitial, t0.username FROM APPUSER t0 WHERE t0.id = ? [params=?] > 26146 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > [3 ms] spent > 26147 poc TRACE [main] openjpa.jdbc.JDBC - <t 346652520, conn > 804578842> [0 ms] close > 26165 poc TRACE [main] openjpa.jdbc.JDBC - The batch limit is set to > 100. > 26169 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > executing prepstmnt 170839542 INSERT INTO UserGroupAccess (applicationId, > securityLevelId, userId, active) VALUES (?, ?, ?, ?) [params=?, ?, ?, ?] > 26180 poc TRACE [main] openjpa.jdbc.SQL - <t 346652520, conn 804578842> > [11 ms] spent > 26188 poc TRACE [main] openjpa.jdbc.JDBC - <t 346652520, conn > 804578842> [0 ms] close > 26189 poc TRACE [main] openjpa.Runtime - > org.apache.openjpa.persistence.EntityManagerImpl@6f29660b.close() invoked. > > ...BUT, after some inserts, it just hangs and the method just seems to be > blocked somehow. > > > > [] > > Leo > > > On Thu, Nov 21, 2013 at 7:19 PM, Leonardo K. Shikida <shik...@gmail.com>wrote: > >> running embedded tomee 1.6.0+ to generate the initial JPA db schema and >> populate with initial data >> >> data source is declared from a properties >> >> private static Properties getOracleDatasource() { >> final Properties p = new Properties(); >> p.put("poc1", "new://Resource?type=DataSource"); >> p.put("poc1.JdbcDriver", "oracle.jdbc.OracleDriver"); >> p.put("poc1.JdbcUrl", "jdbc:oracle:thin:@localhost:1521:XE"); >> p.put("poc1.UserName", "xxx"); >> p.put("poc1.Password", "xxx"); >> return p; >> } >> >> container is instantiated and EJBs are retrieved via JDNI lookup >> >> ejbContainer = EJBContainer.createEJBContainer(p); >> context = ejbContainer.getContext(); >> authEJB = (AuthEJB) >> context.lookup("java:global/xyz/"+AuthEJB.class.getSimpleName()); >> >> EJBs provide transactional context and perform simple CRUD operations via >> DAO classes >> >> for example >> >> UserGroupAccess userGroupAccessAdmin = new UserGroupAccess(); >> userGroupAccessAdmin.setActive(true); >> userGroupAccessAdmin.setPk(new >> UserGroupAccessPK(sessionManager.getId(),administrator.getId(), >> sampleUser.getId())); >> userGroupAccessAdmin.setApplication(sessionManager); >> userGroupAccessAdmin.setSecurityLevel(administrator); >> userGroupAccessAdmin.setUser(sampleUser); >> >> >> this.getAuthEJB().addUserGroupAccess(userGroupAccessAdmin); <= >> exception happens here >> >> where >> >> public void addUserGroupAccess(UserGroupAccess userGroupAccess) { >> this.baseService.getUserGroupAccessDAO().add(userGroupAccess); >> } >> >> >> Several other objects are persisted in the same way, but only for this >> one, that has an embedded composite PK, the exception is raised. In fact, >> I've just disabled the points in the code where these objects are persisted >> to keep working until I find a solution/workaround for this. >> >> My persistence.xml >> >> <?xml version="1.0" encoding="UTF-8"?> >> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence >> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> >> <persistence-unit name="poc"> >> <jta-data-source>poc1</jta-data-source> >> <non-jta-data-source>poc2</non-jta-data-source> >> <properties> >> <property name="openjpa.jdbc.DBDictionary" >> value="org.apache.openjpa.jdbc.sql.OracleDictionary" /> >> <property name="openjpa.jdbc.DBDictionary" >> value="oracle(maxEmbeddedBlobSize=-1,maxEmbeddedClobSize=-1)" /> >> <property name="openjpa.jdbc.SynchronizeMappings" >> value="buildSchema(ForeignKeys=true)" /> >> <!-- <property name="openjpa.Log" value="DefaultLevel=WARN, >> Runtime=INFO, Tool=INFO, SQL=TRACE"/> --> >> </properties> >> </persistence-unit> >> </persistence> >> >> thanks >> >> >> [] >> >> Leo >> >> >> On Thu, Nov 21, 2013 at 5:18 PM, Rick Curtis <curti...@gmail.com> wrote: >> >>> What is the scenario that you are running when you encounter this >>> problem? >>> >>> >>> On Thu, Nov 21, 2013 at 9:46 AM, Leonardo K. Shikida <shik...@gmail.com >>> >wrote: >>> >>> > tomee 1.5.2 = openJPA 2.2.0 >>> > tomee 1.6.0 = openJPA 2.3.0-Snapshot >>> > >>> > thanks! >>> > >>> > Leo >>> > >>> > [] >>> > >>> > Leo >>> > >>> > >>> > On Thu, Nov 21, 2013 at 1:17 PM, Rick Curtis <curti...@gmail.com> >>> wrote: >>> > >>> > > Do you know what version of OpenJPA is in TomeEE 1.5.2? >>> > > >>> > > >>> > > On Wed, Nov 20, 2013 at 6:46 PM, Leonardo K. Shikida < >>> shik...@gmail.com >>> > > >wrote: >>> > > >>> > > > Hi >>> > > > >>> > > > My code that was working with tomee 1.5.2 (openEJB 4.5.2 I guess). >>> > > > >>> > > > Now I am trying to use tomee 1.6.0 (openEJB 4.6.0 I guess again). >>> > > > >>> > > > My class uses a primary key following this structure >>> > > > >>> > > > @Entity >>> > > > public class UserGroupAccess implements Serializable{ >>> > > > >>> > > > /** >>> > > > * >>> > > > */ >>> > > > private static final long serialVersionUID = >>> 7233673815582184369L; >>> > > > >>> > > > @ManyToOne >>> > > > @JoinColumn(name="applicationId") >>> > > > @MapsId("applicationId") >>> > > > private Application application; >>> > > > >>> > > > @ManyToOne >>> > > > @JoinColumn(name="securityLevelId") >>> > > > @MapsId("securityLevelId") >>> > > > private SecurityLevel securityLevel; >>> > > > >>> > > > @ManyToOne >>> > > > @JoinColumn(name="userId") >>> > > > @MapsId("userId") >>> > > > private User user; >>> > > > >>> > > > @EmbeddedId >>> > > > private UserGroupAccessPK pk; >>> > > > (...) >>> > > > } >>> > > > >>> > > > and the primary key >>> > > > >>> > > > @Embeddable >>> > > > public class UserGroupAccessPK implements Serializable{ >>> > > > >>> > > > /** >>> > > > * >>> > > > */ >>> > > > private static final long serialVersionUID = >>> 7233673815582184369L; >>> > > > >>> > > > public UserGroupAccessPK(long application, >>> > > > long securityLevel, long user) { >>> > > > super(); >>> > > > this.applicationId = application; >>> > > > this.securityLevelId = securityLevel; >>> > > > this.userId = user; >>> > > > } >>> > > > >>> > > > public UserGroupAccessPK() { >>> > > > super(); >>> > > > } >>> > > > >>> > > > private long applicationId; >>> > > > >>> > > > private long securityLevelId; >>> > > > >>> > > > private long userId; >>> > > > (...) >>> > > > } >>> > > > >>> > > > These classes are enhanced manually with >>> > > > org.apache.openjpa.enhance.PCEnhancer >>> > > > >>> > > > While trying to run some tests, I've got the following exception >>> > > > >>> > > > INFO: Starting OpenJPA 2.3.0-SNAPSHOT >>> > > > Nov 20, 2013 10:31:32 PM null >>> > > > INFO: Connected to Oracle version 11.11 using JDBC driver Oracle >>> JDBC >>> > > > driver version 12.1.0.1.0. >>> > > > Nov 20, 2013 10:31:39 PM >>> > > > org.apache.geronimo.transaction.manager.TransactionImpl >>> > beforeCompletion >>> > > > WARNING: Unexpected exception from beforeCompletion; transaction >>> will >>> > > roll >>> > > > back >>> > > > <openjpa-2.3.0-SNAPSHOT-r422266:1535082 nonfatal general error> >>> > > > org.apache.openjpa.persistence.PersistenceException: >>> > > > org.apache.openjpa.kernel.DetachedStateManager cannot be cast to >>> > > > org.apache.openjpa.kernel.StateManagerImpl >>> > > > at >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2027) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:512) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:413) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:262) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:328) >>> > > > at >>> > > > >>> > >>> org.apache.openejb.core.transaction.TxRequired.commit(TxRequired.java:75) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:76) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:231) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:181) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:272) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:267) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:90) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:306) >>> > > > Caused by: java.lang.ClassCastException: >>> > > > org.apache.openjpa.kernel.DetachedStateManager cannot be cast to >>> > > > org.apache.openjpa.kernel.StateManagerImpl >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.jdbc.meta.FieldMapping.setPKValueFromMappedByIdField(FieldMapping.java:640) >>> > > > at >>> > > > >>> org.apache.openjpa.jdbc.meta.FieldMapping.insert(FieldMapping.java:622) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.insert(AbstractUpdateManager.java:239) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.populateRowManager(AbstractUpdateManager.java:166) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:110) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:78) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:732) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131) >>> > > > at >>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2203) >>> > > > at >>> > > org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2101) >>> > > > at >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2019) >>> > > > ... 17 more >>> > > > >>> > > > Exception in thread "main" >>> javax.ejb.EJBTransactionRolledbackException: >>> > > > Transaction was rolled back, presumably because setRollbackOnly was >>> > > called >>> > > > during a synchronization >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:379) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:310) >>> > > > Caused by: javax.transaction.RollbackException: Unable to commit: >>> > > > transaction marked for rollback >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:272) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:328) >>> > > > at >>> > > > >>> > >>> org.apache.openejb.core.transaction.TxRequired.commit(TxRequired.java:75) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:76) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:231) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:181) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:272) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:267) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:90) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:306) >>> > > > ... 3 more >>> > > > Caused by: >>> > > > org.apache.geronimo.transaction.manager.SetRollbackOnlyException: >>> > > > setRollbackOnly() called. See stacktrace for origin >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.setRollbackOnly(TransactionImpl.java:126) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionManagerImpl.setRollbackOnly(TransactionManagerImpl.java:243) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openejb.core.TransactionSynchronizationRegistryWrapper.setRollbackOnly(TransactionSynchronizationRegistryWrapper.java:71) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.ee.RegistryManagedRuntime$TransactionManagerRegistryFacade.setRollbackOnly(RegistryManagedRuntime.java:128) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.ee.RegistryManagedRuntime.setRollbackOnly(RegistryManagedRuntime.java:74) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.ee.AutomaticManagedRuntime.setRollbackOnly(AutomaticManagedRuntime.java:274) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.BrokerImpl.setRollbackOnlyInternal(BrokerImpl.java:1670) >>> > > > at >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.BrokerImpl.setRollbackOnly(BrokerImpl.java:1650) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.DelegatingBroker.setRollbackOnly(DelegatingBroker.java:981) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.persistence.EntityManagerImpl.setRollbackOnly(EntityManagerImpl.java:631) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.persistence.PersistenceExceptions$2.translate(PersistenceExceptions.java:77) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.BrokerImpl.translateManagedCompletionException(BrokerImpl.java:2089) >>> > > > at >>> > > > >>> > > >>> > >>> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2027) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:512) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:413) >>> > > > at >>> > > > >>> > > > >>> > > >>> > >>> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:262) >>> > > > ... 13 more >>> > > > >>> > > > Any help is welcome. >>> > > > >>> > > > Thanks in advance. >>> > > > >>> > > > Leo >>> > > > >>> > > >>> > > >>> > > >>> > > -- >>> > > *Rick Curtis* >>> > > >>> > >>> >>> >>> >>> -- >>> *Rick Curtis* >>> >> >> >