我创建了一个PersonDao对象,它是一个可注入的Bean,应该使用注入的实体管理器。问题在于@PersistenceContext()不会注入我的对象并将其保留为null。我正在使用JBoss独立EAP 6.2。波纹管我是我的文件:
hello.dao / PersonDao:
package hello.dao;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import hello.entity.Location;
import hello.entity.Person;
@Stateless
public class PersonDao {
@PersistenceContext(unitName="helloPersistence")
static EntityManager em;
Person person;
@Inject
public PersonDao() {
}
public void addLocation(Location location) {
// em is always null
System.out.println(em.toString());
em.persist(person);
em.persist(location);
person.getLocations().add(location);
location.getPersons().add(person);
em.flush();
}
public void setPerson(Person person) {
this.person = person;
}
public void savePerson() {
em.persist(person);
em.flush();
}
public static List<?> list() {
List<?> results = em.createNativeQuery("SELECT * FROM PERSON").getResultList();
return results;
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8" ?>
<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" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="helloPersistence">
<jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>
<class>hello.dao.LocationDao</class>
<class>hello.dao.PersonDao</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="javax.persistence.schema-generation.database.action"
value="drop-and-create" />
</properties>
</persistence-unit>
</persistence>
Standalone.xml数据源:
<datasources>
<datasource jta="true" jndi-name="java:jboss/datasources/MySqlDS" pool-name="java:jboss/datasources/MySqlDS_Pool" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:mysql://localhost:3306/hello</connection-url>
<driver>mysql</driver>
<pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>100</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name>root</user-name>
<password>password</password>
</security>
</datasource>
<drivers>
<driver name="mysql" module="com.mysql.connectorj">
<driver-class>com.mysql.jdbc.Driver</driver-class>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>
<driver name="db2" module="com.ibm.db2">
<driver-class>com.ibm.db2.jcc.DB2Driver</driver-class>
<xa-datasource-class>com.ibm.db2.jcc.DB2XADataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
在standalone.sh上进行战争部署
13:19:39,530 INFO [org.jboss.as.server.deployment] (MSC service thread 1-14) JBAS015876: Starting deployment of "hello.war" (runtime-name: "hello.war")
13:19:39,871 INFO [org.jboss.as.jpa] (MSC service thread 1-14) JBAS011401: Read persistence.xml for helloPersistence
13:19:39,912 INFO [org.jboss.weld.deployer] (MSC service thread 1-11) JBAS016002: Processing weld deployment hello.war
13:19:39,915 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-11) JNDI bindings for session bean named PersonDao in deployment unit deployment "hello.war" are as follows:
java:global/hello/PersonDao!hello.dao.PersonDao
java:app/hello/PersonDao!hello.dao.PersonDao
java:module/PersonDao!hello.dao.PersonDao
java:global/hello/PersonDao
java:app/hello/PersonDao
java:module/PersonDao
13:20:07,809 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-9) JBAS010404: Deploying non-JDBC-compliant driver class com.mysql.jdbc.Driver (version 5.1)
13:20:07,810 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-9) JBAS010404: Deploying non-JDBC-compliant driver class com.mysql.fabric.jdbc.FabricMySQLDriver (version 5.1)
13:20:07,810 INFO [org.jboss.weld.deployer] (MSC service thread 1-9) JBAS016005: Starting Services for CDI deployment: hello.war
13:20:07,813 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 436) JBAS011402: Starting Persistence Unit Service 'hello.war#helloPersistence'
13:20:07,814 INFO [org.jboss.weld.deployer] (MSC service thread 1-4) JBAS016008: Starting weld service for deployment hello.war
13:20:07,814 INFO [org.hibernate.ejb.Ejb3Configuration] (ServerService Thread Pool -- 436) HHH000204: Processing PersistenceUnitInfo [
name: helloPersistence
...]
13:20:07,823 INFO [org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator] (ServerService Thread Pool -- 436) HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
13:20:07,825 INFO [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 436) HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
13:20:07,829 INFO [org.hibernate.engine.transaction.internal.TransactionFactoryInitiator] (ServerService Thread Pool -- 436) HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory
13:20:07,829 INFO [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (ServerService Thread Pool -- 436) HHH000397: Using ASTQueryTranslatorFactory
13:20:07,890 INFO [org.jboss.web] (ServerService Thread Pool -- 446) JBAS018210: Register web context: /helloMan
13:20:07,908 INFO [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018565: Replaced deployment "hello.war" with deployment "hello.war"
最佳答案
我必须检查JPA规范,但我敢打赌,该容器根本不喜欢该static
。你能试一下吗:
@PersistenceContext(unitName="helloPersistence")
private EntityManager em; // Not a static but an instance field
代替?