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.