Null EntityManager Spring 4

时间:2014-06-03 16:07:56

标签: java spring hibernate web-applications entitymanager

我正在尝试使用Spring 4设置实体管理器,当我尝试使用NullPointerException注释注入EntityManager时,我总是得到@PersistenceContext

我有Maven网络应用程序。这是我的applicationContext.xml配置

<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="EcommercePU">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
        <list>
            <value>com.mysite.ecommerceapp.domain</value>
            <value>com.mysite.ecommerceapp.domain.*</value>
            <value>com.mysite.ecommerceapp.domain.*.*</value>
            <value>com.mysite.ecommerceapp.domain.*.*.*</value>
        </list>
    </property> 
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL9Dialect</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/ecommercedb" />
    <property name="username" value="postgres" />
    <property name="password" value="test" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="myEmf" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="persistenceExceptionTranslationPostProcessor"
     class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

applicationContext.xml位于WEB-INF文件夹下。因为我使用NetBeans 8,所以我从项目属性中为项目添加了Spring Framework支持 - &gt;构架。我正在使用EntityManager注入名为GenericDaoImpl的文件,这是它的代码:

public abstract class GenericDaoImpl<E extends EntityClass> implements GenericDao<E> {

private Class<E> entityClass;

@PersistenceContext()
private EntityManager entityManager;

//Constructor
public GenericDaoImpl(final Class<E> entityClass) {
    this.entityClass = entityClass;
}

//Getters and Setters
public Class<E> getEntityClass() {
    return entityClass;
}

public void setEntityClass(final Class<E> entityClass) {
    this.entityClass = entityClass;
}

public EntityManager getEntityManager() {
    return entityManager;
}

public void setEntityManager(final EntityManager entityManager) {
    this.entityManager = entityManager;
}

public void checkEntityManager() {
    System.out.println("em: " + this.entityManager);
}
}

我有一个测试文件,我只需使用checkEntityManager()方法打印实体管理器。每当我运行它时,我总是得到EntityManager的 null 值。可能有什么不对?我最大的疑问是我的applicationContext.xml位置错误或者没有在任何地方使用,因此它无法在applicationContext中找到配置属性。我已经测试了将applicationContext.xml文件移动到资源文件夹,但它也没有帮助。我也有其他问题:

  1. 我是否需要拥有persistence.xml?由于我使用带有packagesToScan功能的Spring 4,我听说persistence.xml不是必需的,但我不确定。

  2. 使用hibernate仅使用JdbcTemplate来处理基本实体cruds和其他dao查询是否明智?

  3. 所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我终于解决了这个问题,还有很多事情要做。

  1. 当我通过JUnit测试测试我的实体管理器时,我得到了NullPointerException,原因是配置文件是不正确的文件夹。

  2. applicationContext.xml已正确设置,但有一个小问题混淆了整个文件,那是<property name="persistenceUnitName" value="EcommercePU">。因为我在整个项目中没有这样的持久性单元文件,所以无法找到它。添加该属性时,并不意味着您已创建具有此类持久性单元名称的spring配置文件。它只是意味着如果您想为LocalContainerEntityManagerFactory提供持久性配置,您可以将该名称引用到持久性单元。春季4不需要这样做。

  3. 必须将applicationContext.xml从WEB-INF移动到资源文件夹。

  4. 当您运行JUnit测试时,您应该使用@Autowired注释来注释DAO。

  5. Dao实现类应该有@Repository注释。

  6. 如果您要使用,至少对于CRUD方法,
  7. @Transactional注释是必需的。您还可以注释整个班级。如果您没有添加@Transactional注释,EntityManager将无法正确执行持久,删除,更新,查找和其他方法。请记住,如果您使用的是Spring配置,则需要这样做。