我将一些Book实体保存在MySQL创建的名为Books的数据库中。
这是我的persistence.xml:

<persistence-unit name="mysqltest" transaction-type="RESOURCE_LOCAL">

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<!-- list all classes -->
<class>it.mysql.beginner.User</class>
<class>it.mysql.beginner.Book</class>
<class>it.mysql.beginner.Kind</class>

<properties>
  <!-- some properties needed by persistence provider:
    - driver
    - db url
    - db user name
    - db user password -->
  <property name="javax.persistence.target-database" value="MySQL"/>
  <property name="javax.persistence.logging.level" value="INFO"/>
  <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
  <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/Books"/>
  <property name="javax.persistence.jdbc.user" value="lory"/>
  <property name="javax.persistence.jdbc.password" value="brookhaven12#"/>
  <property name="eclipselink.ddl-generation.output-mode" value="database" />

  <property name="eclipselink.ddl-generation" value="create-tables" />

  </properties>

</persistence-unit>


这是一个通用的jpaDAO

public abstract class jpaDAO<E> {

protected Class<E> entityClass;

@PersistenceContext(unitName = "mysqltest")
protected EntityManager em;

@SuppressWarnings("unchecked")
public jpaDAO() {
    ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
    this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[0];
}

public List<E> findAll() {
    TypedQuery<E> q = em.createQuery("SELECT h FROM " + entityClass.getSimpleName() + " h", entityClass);
    return q.getResultList();
}
...


这是一个BookDAO:

public class BookDAO extends jpaDAO<Book> {

public List<Book> findByAuthor(String author) {

    List<Book> bookList;

    TypedQuery<Book> query = em.createQuery("SELECT b FROM Book b WHERE b.author = author", entityClass);

            query.setParameter("author", author);

            bookList = query.getResultList();

    return bookList;

}
}


在主程序中,我执行:

List<Book> allBooks;
BookDAO bookDAO = new BookDAO();

allBooks = bookDAO.findByAuthor("Stephen King");


然后bookDao.findAll()和bookDao.findByAuthor(“ author”)都可以
NullPointerException,所以我想象列表allBooks为空。
我不明白...数据库中存储有书籍,为什么没有书籍呢?

最佳答案

您正在呼叫new BookDAO()。但是BookDAO构造函数和超类构造函数都不初始化em字段。因此为空。因此,当您在em上调用方法时,会收到NullPointerException。

EntityManager应该由容器注入(如果您是在EJB / CDI容器中运行的,或者使用的是Spring,则未指定)。但这只有在您从容器中获得BookDAO实例的情况下才有可能。如果您自己实例化该容器,则该容器对该对象一无所知,因此无法注入该对象的任何字段。

因此,应该将BookDAO注入其调用程序中(该调用程序本身应由容器实例化)。

在不知道调用方是什么以及您在哪个环境中运行的情况下,无法给出更多详细信息。

09-10 08:42