0

我整个星期都在努力学习 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;
}

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

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

编辑/更新:

下面是我正在使用的 persistence.xml 文件。我正在运行 MySQL 和 Glassfish。我应该将它保存在WEB-INF哪个是哪里persistence-context.xml还是在src/main/resource哪个是哪里hibernate.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>
4

3 回答 3

0

在 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。

于 2012-09-28T10:27:17.040 回答
0
setEntityManager 

代替

setEngityManager  

你有错字。

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

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

@PersistenceContext(unitName="your_unit_name")
private EntityManager em;
于 2012-09-28T08:04:45.030 回答
0

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

于 2021-09-17T13:31:59.193 回答