【问题标题】:entityManager.persist(object) NullPointerExceptionentityManager.persist(object) NullPointerException
【发布时间】:2012-09-28 08:01:17
【问题描述】:

我整个星期都在努力学习 Java EE。我正在通过 Netbeans 7.2 使用 Restlet 2.0、Spring、Hibernate 和 Maven 构建 REST api。现在,每当我进行尝试将数据持久化到数据库的服务调用时,以下方法都会引发NullPointerException

@Override
public void save(T object) {
    entityManager.persist(object);
}

通过查看代码,以下部分应该注入entityManager

protected EntityManager entityManager;

@PersistenceContext
public void setEngityManager(EntityManager entityManger) {
    this.entityManager = entityManager;
}

我找到了链接EntityManager injection results in NullPointerException。但是我太新了,无法理解如何在我的代码中实现它。另外,我使用的是 Glassfish 3.1.2。

有人可以帮忙提供一些代码示例吗?

编辑/更新:

下面是我正在使用的 persistence.xml 文件。我正在运行 MySQL 和 Glassfish。我应该将它保存在WEB-INF 下(persistence-context.xml 所在的位置)还是src/main/resourcehibernate.cfg.xml 所在的位置?

<?xml version="1.0" encoding="UTF-8"?>
<persistence-unit name="pu1" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.mysite.restapi.RestletChildApplication</class>
    <properties>
            <property name="hibernate.connection.driver_class"
                    value="com.mysql.jdbc.Driver" />
            <property name="hibernate.connection.url"
                    value="jdbc:mysql://localhost:3306/mydatabase" />
            <property name="hibernate.connection.username" value="myname"/>
            <property name="hibernate.connection.password" value="mypassword"/>
            <property name="show_sql" value="true" />
            <property name="dialect" value="org.hibernate.dialect.MySQLDialect" />
    </properties>
</persistence-unit>

【问题讨论】:

  • 我正在运行java EE 6
  • 注射从何而来?根据&lt;class&gt;com.mysite.restapi.RestletChildApplication&lt;/class&gt; 行,我是否应该在com.mysite.restapi.RestletChildApplication 类中创建EntityManager 的实例?

标签: java spring hibernate glassfish-3 entitymanager


【解决方案1】:
setEntityManager 

而不是

setEngityManager  

你有错字。

创建持久化单元,比如这里
java.net

并通过持久化单元的名称注入 EntityManager

@PersistenceContext(unitName="your_unit_name")
private EntityManager em;

【讨论】:

  • 谢谢!我修复了它并重新运行等。但我仍然在entityManager.persist(object);得到NPE
  • persistence-context.xml 是否与persistence.xml 相同?我有前者,但没有后者。我的persistence-context.xml 也是由 netbeans 生成的。我应该另外创建一个persistence.xml 文件吗?
  • 第一次听persistence-context.xml。你必须有persistence.xml
【解决方案2】:

在 Java EE 5 中,@PersistenceContext(unitName="your_unit_name") 只能用于容器管理的对象,如 EJB 或 Servlet。

如果您想在非容器托管对象(如普通 java 类)中创建 EntityManager 对象,请参考以下示例。

private EntityManagerFactory emf;

public static EntityManagerFactory getEntityManagerFactory() {
    if (emf == null) {
        emf = Persistence.createEntityManagerFactory("your_unit_name");
    }
    return emf;
}

public static EntityManager getEntityManager() {
    EntityManager entityManager = null;
    if (null != emf)
           entityManager = emf.createEntityManager();

    return entityManager;
}

如果是 Java EE 6,您可以参考 CDI - Context and Dependency injection 了解如何注入 EntityManager。

【讨论】:

  • 我正在运行EE 6。我上面的persistence.xml 文件看起来正确吗?我刚刚编辑了帖子以添加它。
【解决方案3】:

以上答案很有用。非常短的版本很可能是您的 EntityManager 为空。调用本身不应引发空指针异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多