【发布时间】:2015-04-20 02:26:11
【问题描述】:
您好,我正在使用 JPA2 设置一个非常简单的应用程序,当我尝试使用 EntityManager 时出现空指针异常 我在用: 智能理念 马文 JPA 2 小服务程序 3 雄猫 7
这是我的项目的结构: -> http://picpaste.com/screen1-ZKITGaeh.jpg
Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence-unit name="mymoneyunit" transaction-type="RESOURCE_LOCAL">
<description>
Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.mymoney.entities.User</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/moneydb" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="****" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
</properties>
</persistence-unit>
用户DAO:
package com.mymoney.database;
import com.mymoney.entities.User;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.List;
public class UserDAO {
private EntityManager em;
@PersistenceContext(unitName = "mymoneyunit")
public void setEntityManager(EntityManager entityManager) {
this.em = entityManager;
}
public List<User> findAll() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> criteria = cb.createQuery(User.class);
Root<User> user = criteria.from(User.class);
criteria.select(user).orderBy(cb.asc(user.get("name")));
return em.createQuery(criteria).getResultList();
}
}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>myMoney</groupId>
<artifactId>myMoney-artifact</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<hibernate.version>4.3.8.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- <dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<scope>provided</scope>
</dependency> -->
<!-- MySQL JDBC connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
<scope>provided</scope>
</dependency>
<!-- tomcat jdbc -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>7.0.35</version>
<scope>provided</scope>
</dependency>
<!-- ******* JPA/Hibernate ******** -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>2.0.4.Final</version>
<exclusions>
<exclusion>
<groupId>org.jboss.spec.javax.el</groupId>
<artifactId>jboss-el-api_3.0_spec</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
家庭控制器:
@WebServlet("/home")
public class HomeController extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
System.out.println("doGet");
UserDAO uDao = new UserDAO();
List<User> users = uDao.findAll();
for(User usr : users){
System.out.println(usr.getEmail());
}
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
例外:
java.lang.NullPointerException
com.mymoney.database.UserDAO.findAll(UserDAO.java:25)
com.mymoney.controllers.HomeController.doGet(HomeController.java:28)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
没有任何内容被写入与 JPA 设置相关的日志:(.
感谢您的帮助
更新
我在 resources/META-INF 中移动了 persistence.xml 创建了一个新类来管理实体管理器,而不是使用注解来注入实体管理器:
public class PersistenceManager {
private static PersistenceManager INSTANCE;
private EntityManagerFactory emFactory;
public static PersistenceManager getInstance(){
if(PersistenceManager.INSTANCE == null){
PersistenceManager.INSTANCE = new PersistenceManager();
}
return PersistenceManager.INSTANCE;
}
private PersistenceManager() {
emFactory = Persistence.createEntityManagerFactory("mymoneyunit");
}
public EntityManager getEntityManager() {
return emFactory.createEntityManager();
}
public void close() {
emFactory.close();
}
}
现在我得到: 原因:java.lang.ClassNotFoundException:无法加载请求的类:com.mysql.jdbc.Driver
修复了上面的问题,在intellij中检查要导出的mysql jar,并在classpath中改变它的顺序。
【问题讨论】:
-
显示 HomeController 的代码。它如何获得对 dao 的引用?
-
还有 beans.xml。你的 pom 不相关。
-
我编辑了问题并添加了您询问的详细信息.. 谢谢
标签: java maven jpa intellij-idea nullpointerexception