我在使用返回Persist()
的{{1}} EntityManager
方法时遇到问题,这里是我的代码:
NullPointerExpception
Excetion符合@Repository("chainDao")
public class ChainDaoImpl implements ChainDao{
private EntityManager em;
@PersistenceContext(unitName="hibernatePersistenceUnit")
public void setEntityManager(EntityManager em) {
this.em = em;
}
public int saveChain(Chain chain) {
em.persist(chain);
return 0;
}
}
这是我的em.persist(chain)
persistence.xml
和<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="hibernatePersistenceUnit" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.hbm2ddl.auto" value="none" />
</properties>
</persistence-unit>
</persistence>
applicationContext.xml
迹:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="${database.driver}"
p:jdbcUrl="${database.url}"
p:user="${database.user}"
p:password="${database.password}"
p:acquireIncrement="5"
p:idleConnectionTestPeriod="60"
p:maxPoolSize="100"
p:maxStatements="50"
p:minPoolSize="10" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property>
<property name="persistenceUnitName" value="hibernatePersistenceUnit" />
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name="showSql" value="true"/>
</bean>
</property>
</bean>
任何线索我错过了什么?
答案 0 :(得分:2)
注入的实体管理器只是一个代理。基于与使用实体管理器的方法相关联的@Transactional
注释中的传播属性值,在运行时注入实际实体管理器实现。因此,请将方法saveChain
与@Transactional
注释相关联,如下所示。
@Transactional
public int saveChain(Chain chain) {
em.persist(chain);
return 0;
}
强烈建议您阅读此注释的文档,并使用与您的用例相关的值设置注释属性。
修改强>:
Spring DI框架似乎没有选择setter setEntityManager
,因为属性名称为em
。您可能希望将属性em
重命名为entityManager
,或将设置器setEntityManager
重命名为setEm
,或将@PersistenceContext
注释重命名为属性并尝试。