hi, container managed transactions aren't supported (only bean managed transactions). that's also reflected in the name (BeanManagedUserTransactionStrategy).
if you need cmt/cmp, use std. ejbs. regards, gerhard 2013/9/28 Christian Kaltepoth <[email protected]> > Regarding BUG2: > > AFAIK you can remove the closeEntityManager() method because the lifecycle > of the EntityManager is managed by the container. I think our documentation > may need some improvement regarding this. > > Christian > > > > 2013/9/28 十三郎 <[email protected]> > > > hi everyone: > > i write a simple jpa demo,still hava two bugs. > > (i use jboss as 7.1.1.final ; jdk1.7) > > > > 1,follow deltaspike jpamodule documents,i define a EntityManagerProducer > > public class EntityManagerProducer > > { > > @PersistenceContext(unitName = "persistence0") > > private EntityManager entityManager; > > @Produces > > @RequestScoped > > protected EntityManager createEntityManager() > > { > > return this.entityManager; > > } > > protected void closeEntityManager(@Disposes EntityManager > > entityManager) > > { > > if (entityManager.isOpen()) > > { > > entityManager.close(); > > } > > } > > } > > > > > > 2,and i want do some database action: > > --------------------------- > > @Named("jpaTest") > > public class JpaTest > > { > > @Inject > > private EntityManager entityManager; > > @Named > > @Transactional > > public void executeInTransaction(){ > > Query query = null; > > String sql="insert into grandscape_user (user_name,user_password) > > values (:u,:p)"; > > query=entityManager.createNativeQuery(sql); > > query.setParameter("u", "2013"); > > query.setParameter("p", "20132222"); > > query.executeUpdate(); > > } > > } > > ------------------- > > > > > > 3,i use jsf to call method #{jpaTest.executeInTransaction}. > > <h:commandButton value="jpa Method" > > action="#{jpaTest.executeInTransaction}" /> > > > > 4,and persistence.xml. > > if transaction-type="JTA" ,the code run to [A JTA EntityManager cannot > use > > getTransaction] error. > > > > (BUG1) > > i add the alternatives section to beans.xml to fix. > > <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=" > > http://www.w3.org/2001/XMLSchema-instance" > > xsi:schemaLocation="http://java.sun.com/xml/ns/javaee > > http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> > > <interceptors> > > > > > <class>org.apache.deltaspike.security.impl.extension.SecurityInterceptor</class> > > > > > <class>org.apache.deltaspike.jpa.impl.transaction.TransactionalInterceptor</class> > > </interceptors> > > <alternatives> > > > > > > <class>org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy</class> > > </alternatives> > > </beans> > > but the code still run to error(A JTA EntityManager cannot use > > getTransaction()) > > so i set transaction-type="RESOURCE_LOCAL". > > --------------------- > > <?xml version="1.0" encoding="UTF-8"?> > > <persistence 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" > > version="2.0"> > > <persistence-unit name="persistence0" > > transaction-type="RESOURCE_LOCAL"> > > <provider>org.hibernate.ejb.HibernatePersistence</provider> > > <jta-data-source>java:jboss/datasources/MysqlDS</jta-data-source> > > <properties> > > <!-- Properties for Hibernate (default provider for JBoss AS) > > --> > > <property name="hibernate.dialect" > > value="org.hibernate.dialect.MySQLDialect"/> > > <property name="hibernate.connection.username" > value="root" > > /> > > <property name="hibernate.connection.password" > > value="root" /> > > <property name="hibernate.connection.driver_class" > > value="com.mysql.jdbc.Driver" /> > > <property name="hibernate.connection.url" > > value="jdbc:mysql://localhost:3306/grandscape_website" /> > > > > <property name="hibernate.show_sql" value="true"/> > > <!-- Only format when you need to debug, because it slows > > things down --> > > <property name="hibernate.format_sql" value="false"/> > > <property name="hibernate.show_sql" value="true" /> > > <property name="hibernate.hbm2ddl.auto" value="update" /> > > <!-- > > <property name="hibernate.hbm2ddl.auto" value="create-drop"/> > > --> > > </properties> > > </persistence-unit> > > </persistence> > > ------------ > > > > > > 5,finally,when i called #{jpaTest.executeInTransaction} method,the data > > was fill to database successful, > > but the code run to a error: > > > > (BUG2) > > -------------------------- > > > > ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host]] > > (http--0.0.0.0-8080-1) Exception sending request destroyed lifecycle > event > > to listener instance of class org.jboss.weld.servlet.WeldListener: > > java.lang.IllegalStateException: JBAS011424: Container managed entity > > manager can only be closed by the container (auto-cleared at > tx/invocation > > end and closed when owning component is closed.) > > at > > > org.jboss.as.jpa.container.TransactionScopedEntityManager.close(TransactionScopedEntityManager.java:98) > > [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final] > > at > > > persist.EntityManagerProducer.closeEntityManager(EntityManagerProducer.java:21) > > [classes:] > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > [rt.jar:1.7.0_07] > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > > [rt.jar:1.7.0_07] > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > [rt.jar:1.7.0_07] > > at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_07] > > at > > > org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:264) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:260) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:170) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:51) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:154) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.bean.DisposalMethod.invokeDisposeMethod(DisposalMethod.java:158) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > org.jboss.weld.bean.ProducerMethod$1.dispose(ProducerMethod.java:122) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > org.jboss.weld.bean.ProducerMethod.destroy(ProducerMethod.java:197) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.context.ForwardingContextual.destroy(ForwardingContextual.java:31) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > org.jboss.weld.context.AbstractContext.destroy(AbstractContext.java:132) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > org.jboss.weld.context.AbstractContext.destroy(AbstractContext.java:146) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.context.AbstractManagedContext.deactivate(AbstractManagedContext.java:41) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.context.AbstractBoundContext.deactivate(AbstractBoundContext.java:72) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.context.http.HttpRequestContextImpl.deactivate(HttpRequestContextImpl.java:86) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.jboss.weld.servlet.WeldListener.requestDestroyed(WeldListener.java:103) > > [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31] > > at > > > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) > > [jbossweb-7.0.13.Final.jar:] > > at > > > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) > > [jbossweb-7.0.13.Final.jar:] > > at > > > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) > > [jbossweb-7.0.13.Final.jar:] > > at > > > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) > > [jbossweb-7.0.13.Final.jar:] > > at > > > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) > > [jbossweb-7.0.13.Final.jar:] > > at > > > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) > > [jbossweb-7.0.13.Final.jar:] > > at > > org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) > > [jbossweb-7.0.13.Final.jar:] > > at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_07] > > --------------------------------- > > > > if i delete [entityManager.close();] line in EntityManagerProducer,the > > error disappeared. > > > > > -- > Christian Kaltepoth > Blog: http://blog.kaltepoth.de/ > Twitter: http://twitter.com/chkal > GitHub: https://github.com/chkal >
