Недавно я изучаю J2EE. Я использую IntelliJ
, а мой веб-сервер - Tomcat
. Я хочу добавить OpenJPA
в свой проект, но я встречаю некоторые проблемы.
У меня есть два объекта: BooksEntity
и SourcesEntity
.
Когда я вызвал createEntityManager()
в Servlet
, он дал мне NullPointerException
.
Кажется, я что-то пропустил, но не знаю почему.
Вот информация об исключении:
java.lang.NullPointerException
controller.TestServlet.doGet(TestServlet.java:28)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Это мой файл TestServlet.java
:
@WebServlet(name = "TestServlet", urlPatterns = {"/books"})
public class TestServlet extends HttpServlet {
@PersistenceUnit (unitName = "booksPU")
private EntityManagerFactory emf;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
EntityManager em = emf.createEntityManager();
Query query = em.createNamedQuery("Books.findAll");
request.setAttribute("books", (List<BooksEntity>) query.getResultList());
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
Исключение было EntityManager em = emf.createEntityManager();
в этой строке: EntityManager em = emf.createEntityManager();
Это мой файл context.xml
:
<Context>
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="******" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/FIRST_TEST"/>
</Context>
Мой файл persistence.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="booksPU">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>model.BooksEntity</class>
<class>model.SourcesEntity</class>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/FIRST_TEST"/>
<property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
<property name="openjpa.ConnectionUserName" value="root"/>
<property name="openjpa.ConnectionPassword" value="******"/>
</properties>
</persistence-unit>
</persistence>
======== ======== 2014.06.06
Моя структура каталогов:
======== ======== 2014.06.07
Убедитесь, что при упаковке файла войны файл persistence.xml находится в папке WEB-INF/classes/META-INF
.
Вероятно, это всего лишь опечатка вашего кода. Аннотации должны быть @PersistenceContext
, а не @PersistentUnit
. Вот почему emf
остается null
.
@PersistenceUnit
для EntityManagerFactory
, а @PersistenceContext
для EntityManager
. Они разные.
@PersistenceContext
и EntityManager
напрямую, EntityManager em
по-прежнему равен null
. :(