我正在尝试使用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文件移动到资源文件夹,但它也没有帮助。我也有其他问题:
我是否需要拥有persistence.xml?由于我使用带有packagesToScan功能的Spring 4,我听说persistence.xml不是必需的,但我不确定。
使用hibernate仅使用JdbcTemplate来处理基本实体cruds和其他dao查询是否明智?
所有帮助将不胜感激。
答案 0 :(得分:1)
我终于解决了这个问题,还有很多事情要做。
当我通过JUnit测试测试我的实体管理器时,我得到了NullPointerException
,原因是配置文件是不正确的文件夹。
applicationContext.xml
已正确设置,但有一个小问题混淆了整个文件,那是<property name="persistenceUnitName" value="EcommercePU">
。因为我在整个项目中没有这样的持久性单元文件,所以无法找到它。添加该属性时,并不意味着您已创建具有此类持久性单元名称的spring配置文件。它只是意味着如果您想为LocalContainerEntityManagerFactory
提供持久性配置,您可以将该名称引用到持久性单元。春季4不需要这样做。
必须将applicationContext.xml从WEB-INF移动到资源文件夹。
当您运行JUnit测试时,您应该使用@Autowired
注释来注释DAO。
Dao实现类应该有@Repository
注释。
@Transactional
注释是必需的。您还可以注释整个班级。如果您没有添加@Transactional
注释,EntityManager将无法正确执行持久,删除,更新,查找和其他方法。请记住,如果您使用的是Spring配置,则需要这样做。