我正在使用JPA和spring将我的JBOss服务器连接到oracle数据库。
以下是我的配置:
database.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="com.example" />
<!-- Add JPA support -->
<bean id="emf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="unitDS" />
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
</bean>
<!-- Add Transaction support -->
<bean id="mtsTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
</bean>
<!-- Use @Transaction annotations for managing transactions -->
<tx:annotation-driven transaction-manager="mtsTxManager"
proxy-target-class="true" />
</beans>
的persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- @version $Date: 2010-06-04 15:50:29 +0200 (Fri, 04 Jun 2010) $ | $LastChangedBy:
ext_computaris_eprager $ | LastChangedRevision: $Rev: 2424 $ -->
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="unitDS"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:jboss/datasources/unitDS</non-jta-data-source>
<class>com.example.foo</class>
<class>com.example.bar</class>
<!-- properties specific for the underlying implementation of the JPA EntityManager
(Hibernate) -->
<properties>
<!-- ////////////// HBM/DDL related properties ////////////// were removed
from here (set as system properties in tests) -->
<!-- NCA -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="jboss.entity.manager.factory.jndi.name"
value="java:/locationserverEntityManagerFactory" />
<!-- ////////////// Enable JTA transaction ////////////// -->
<property name="transaction.factory_class"
value="org.hibernate.transaction.JTATransactionFactory" />
<property name="jta.UserTransaction" value="java:comp/UserTransaction" />
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<!-- ////////////// debugging/testing related properties ////////////// -->
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.use_sql_comments" value="false" />
<!-- 2nd level cache -->
<!-- <property name="hibernate.cache.provider_class" -->
<!-- value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" /> -->
<!-- <property name="net.sf.ehcache.configurationResourceName" -->
<!-- value="/ehcache.xml" /> -->
<!-- <property name="hibernate.cache.use_query_cache" value="true" /> -->
<!-- <property name="hibernate.cache.use_second_level_cache" -->
<!-- value="true" /> -->
<!-- <property name="hibernate.generate_statistics" value="true" /> -->
</properties>
</persistence-unit>
</persistence>
弹簧上下文正常初始化。我收到了消息:
Starting persistence unit unitDS
当我启动服务器时。
我还有一个抽象的dao JPA,我使用注释@persistenceContext注入我的上下文:
public class AbstractDaoJpa<E, PK> implements DaoBase<E, PK> {
/**
*
*/
@PersistenceContext(unitName="unitDS")
@Qualifier(value = "entityManagerFactory")
private EntityManager em;
问题是当我尝试连接到我的数据库时,我的EntityManager始终为空。
我不明白这个问题来自哪里。我配置不好吗?
我尝试了几个类似帖子的解决方案,但无法解决我的问题。
答案 0 :(得分:0)
我不确定,如果这是问题所在,但在Spring配置中,您有emf
作为bean名称,而在AbstractDao中,您有entityManagerFactory
作为限定符。所以我猜Spring没有注入正确的bean。
答案 1 :(得分:0)
您似乎没有添加<context:component-scan base-package="your.package" />
来启用组件扫描。为什么不尝试使用适当的包
答案 2 :(得分:0)
我知道情况已经很晚了,但我会写信以备将来参考。使用 new 关键字创建实施实例时会有一个问题。有关详细信息,请查看this thread
答案 3 :(得分:0)
它可能有某些因素 *缺少persistence.xml持久性提供程序
使用任何配置设置applicationContext.xml后,您将获得entitymanagerfactory,即来自LocalEntity,LocalContainer或JNDI Lookup。
使用persistenceContext
private EntityManager em;
用@transactional,@ Repository
分配的类但是你仍然得到em = null,这背后的原因是你没有使用依赖注入来调用你的类。