简体   繁体   English

即使启动了持久性单元实体,JPA Spring注入EntityManager也为null

[英]JPA Spring injection EntityManager is null even if persistence unit entity is started

I am using JPA and spring to connect my JBOss server to an oracle database. 我正在使用JPA和spring将我的JBOss服务器连接到oracle数据库。

Here are my configurations: 这是我的配置:

database.xml 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 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>

The spring context is initialized normally. 弹簧上下文正常初始化。 I got the message : 我收到了消息:

Starting persistence unit unitDS

When I start my server. 当我启动我的服务器。

I also have an abstract dao JPA where I inject my context using annotation @persistenceContext: 我还有一个抽象的dao JPA,我使用注释@persistenceContext注入我的上下文:

public class AbstractDaoJpa<E, PK> implements DaoBase<E, PK> {

    /**
     * 
     */
    @PersistenceContext(unitName="unitDS")
    @Qualifier(value = "entityManagerFactory")
    private EntityManager em;

The problem is when I am trying to connect to my database my EntityManager is always null. 问题是当我尝试连接到我的数据库时,我的EntityManager始终为null。

I don't understand where this problem comes from. 我不明白这个问题来自哪里。 Do I have bad configuration ? 我配置不好吗?

I tried several solutions of similar post but couldn't resolve my problem. 我试过几个类似帖子的解决方案,但无法解决我的问题。

I'm not sure, if this is the problem, but in your Spring configuration you have emf as bean name, and in the AbstractDao you have entityManagerFactory as qualifier. 我不确定,如果这是问题,但在你的Spring配置中你有emf作为bean名称,而在AbstractDao中你有entityManagerFactory作为限定符。 So i guess Spring fails to inject the correct bean. 所以我猜Spring无法注入正确的bean。

You don't seem to have added <context:component-scan base-package="your.package" /> which enables component scanning. 您似乎没有添加<context:component-scan base-package="your.package" /> ,它可以启用组件扫描。 Why don't you try that with the appropriate package 为什么不尝试使用适当的包

I know it's late, But I will write for future reference. 我知道现在已经很晚了,但我会写一下以备将来参考。 There is a catch when you are creating a instance of a implementation using new keyword.For more detail you can check this thread 使用new关键字创建实现的实例时有一个问题。有关更多详细信息,您可以检查此线程

it may have certain factors * in persistence.xml persistence provider is missing 它可能在persistence.xml中有某些因素*缺少持久性提供程序

  • after setting your applicationContext.xml with any config you are getting entitymanagerfactory ie from LocalEntity,LocalContainer or JNDI Lookup . 在使用任何配置设置applicationContext.xml之后,您将获得entitymanagerfactory,即来自LocalEntity,LocalContainer或JNDI Lookup。

    use persistenceContext 使用persistenceContext

      private EntityManager em; 

with class anotated with @transactional , @Repository 与@transactional,@ Repository一起分配的类

but you are still getting em = null the reason behind this is you are not calling your class using Dependency Injection . 但你仍然得到em = null,这背后的原因是你没有使用依赖注入调用你的类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM