[hibernate-issues] [Hibernate-JIRA] Resolved: (HHH-6454) Stafeful, no transaction and persist entity with generatedValue for ID : javax.transaction.InvalidTransactionException: Cannot resume foreign transaction: null
Strong Liu (JIRA)
noreply at atlassian.com
Mon Oct 31 04:59:24 EDT 2011
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-6454?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Strong Liu resolved HHH-6454.
-----------------------------
Resolution: Rejected
Assignee: Strong Liu
not a bug
> Stafeful, no transaction and persist entity with generatedValue for ID : javax.transaction.InvalidTransactionException: Cannot resume foreign transaction: null
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: HHH-6454
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-6454
> Project: Hibernate Core
> Issue Type: Bug
> Components: entity-manager
> Affects Versions: 3.6.3, 3.6.5
> Environment: OpenEJB 3.2.0,Java 6, Hibernate-entity-manager: 3.6.3, hibernate-validator:4.0.2.
> Reporter: pierre devreux
> Assignee: Strong Liu
>
> Here my use case :
> I have
> * a _Service_ entity :
> {code:title=Service.java|borderStyle=solid}
> @Entity
> @TableGenerator(name="ServiceGenerator", pkColumnName="pk_val", pkColumnValue= "service_id", valueColumnName="val",table= "IDENTIFIER")
> public class Service {
> @Id
> @GeneratedValue(generator="ServiceGenerator", strategy=GenerationType.TABLE)
> private long id;
> private String name;
> private String des;
> public Service(){};
>
> public Service(String name, String des) {
> this.name = name;
> this.des = des;
> }
> }
> {code}
> * a _ServiceSF / ServiceSFImpl_ stateful :
> {code:title=ServiceSFImpl.java|borderStyle=solid}
> @Stateful
> @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
> public class ServiceSFImpl implements ServiceSF {
> @PersistenceContext(name="unit", type=PersistenceContextType.EXTENDED)
> EntityManager em;
> public void persist(Service s) {
> em.persist(s);
> }
>
> @Remove
> @TransactionAttribute(TransactionAttributeType.REQUIRED)
> public void remove() {
>
> }
>
> }
> {code}
> * a test
> {code:title=Test.java|borderStyle=solid}
> ...
> @Test
> public void createServiceSF() throws NamingException {
> ServiceSF sf = (ServiceSF) context.lookup("ServiceSFImplLocal");
> Service s = new Service("name", desc");
> sf.persist(s);
> sf.remove();
> }
> ...
> {code}
> When I launch it, persist method raise an exception : _javax.transaction.InvalidTransactionException: Cannot resume foreign transaction: null_ .
> After looking the code, I saw that hibernate starts a new transaction to get the generated ID, and then resume the previous transaction. But in my case there is no transaction, and Hibernate throw an InvalidTransactionException.
> Here the complete stack trace :
> {code:title=Bar.java|borderStyle=solid}
> javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is:
> javax.persistence.PersistenceException: org.hibernate.HibernateException: Unable to resume previously suspended transaction
> at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:359)
> at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:287)
> at $Proxy44.persist(Unknown Source)
> at net.atos.od.td.nda.ddd.rt.jee.impl.DomainTransactionImpl.persist(DomainTransactionImpl.java:163)
> at net.atos.ddd.test.LauncherTest.createService_aroundBody0(LauncherTest.java:39)
> at net.atos.ddd.test.LauncherTest.createService_aroundBody1$advice(LauncherTest.java:31)
> at net.atos.ddd.test.LauncherTest.createService(LauncherTest.java:1)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
> at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
> at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
> at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
> at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
> at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
> at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
> at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: Unable to resume previously suspended transaction
> at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
> at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
> at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153)
> at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
> at org.apache.openejb.persistence.JtaEntityManager.persist(JtaEntityManager.java:114)
> at net.atos.od.td.nda.ddd.rt.jee.impl.GatewayImpl.persist(GatewayImpl.java:39)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:162)
> at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:144)
> at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:164)
> at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:92)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:162)
> at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:144)
> at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:122)
> at org.apache.openejb.core.stateful.StatefulContainer.businessMethod(StatefulContainer.java:566)
> at org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulContainer.java:325)
> at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
> at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
> at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:282)
> ... 32 more
> Caused by: org.hibernate.HibernateException: Unable to resume previously suspended transaction
> at org.hibernate.engine.transaction.Isolater$JtaDelegate.delegateWork(Isolater.java:147)
> at org.hibernate.engine.transaction.Isolater.doIsolatedWork(Isolater.java:67)
> at org.hibernate.engine.TransactionHelper.doWorkInNewTransaction(TransactionHelper.java:74)
> at org.hibernate.id.MultipleHiLoPerTableGenerator$1.getNextValue(MultipleHiLoPerTableGenerator.java:216)
> at org.hibernate.id.enhanced.OptimizerFactory$LegacyHiLoAlgorithmOptimizer.generate(OptimizerFactory.java:351)
> at org.hibernate.id.MultipleHiLoPerTableGenerator.generate(MultipleHiLoPerTableGenerator.java:213)
> at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
> at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
> at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
> at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
> at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
> at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
> at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
> at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672)
> ... 54 more
> Caused by: javax.transaction.InvalidTransactionException: Cannot resume foreign transaction: null
> at org.apache.geronimo.transaction.manager.TransactionManagerImpl.resume(TransactionManagerImpl.java:181)
> at org.hibernate.engine.transaction.Isolater$JtaDelegate.delegateWork(Isolater.java:138)
> ... 68 more
> {code}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list