【问题标题】:How do I get spring to inject my EntityManager?如何让 spring 注入我的 EntityManager?
【发布时间】:2011-02-05 00:53:16
【问题描述】:

我按照指南 here 进行操作,但是当 DAO 执行时,EntityManagernull

我尝试了许多在指南、各种论坛和此处(包括this)的 cmets 中找到的修复程序,但无济于事。不管我做什么,EntityManager 仍然是null

这里是相关文件,为保护无辜者而更改了包等。

spring-context.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
        xmlns:p="http://www.springframework.org/schema/p">

     <context:component-scan base-package="com.group.server"/>
     <context:annotation-config/>
     <tx:annotation-driven/>

     <bean id="propertyPlaceholderConfigurer"
           class="com.group.DecryptingPropertyPlaceholderConfigurer"
           p:systemPropertiesModeName="SYSTEM_PROPERTIES_MODE_OVERRIDE">
         <property name="locations">
             <list>
                 <value>classpath*:spring-*.properties</value>
                 <value>classpath*:${application.environment}.properties</value>
             </list>
         </property>
     </bean>

     <bean id="orderDao" class="com.package.service.OrderDaoImpl"/>

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

     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
         <property name="persistenceUnitName" value="MyServer"/>
         <property name="loadTimeWeaver">
             <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
         </property>
         <property name="dataSource" ref="dataSource"/>
         <property name="jpaVendorAdapter">
             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                 <property name="showSql" value="${com.group.server.vendoradapter.showsql}"/>
                 <property name="generateDdl" value="${com.group.server.vendoradapter.generateDdl}"/>
                 <property name="database" value="${com.group.server.vendoradapter.database}"/>
             </bean>
         </property>
     </bean>

     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
         <property name="entityManagerFactory" ref="entityManagerFactory"/>
         <property name="dataSource" ref="dataSource"/>
     </bean>

     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
         <property name="driverClassName" value="${com.group.server.datasource.driverClassName}"/>
         <property name="url" value="${com.group.server.datasource.url}"/>
         <property name="username" value="${com.group.server.datasource.username}"/>
         <property name="password" value="${com.group.server.datasource.password}"/>
     </bean>

     <bean id="executorService" class="java.util.concurrent.Executors" factory-method="newCachedThreadPool"/>

 </beans>

persistence.xml

<persistence  xmlns="http://java.sun.com/xml/ns/persistence"  version="1.0">
    <persistence-unit name="MyServer" transaction-type="RESOURCE_LOCAL"/>
</persistence>

OrderDaoImpl

 package com.group.service;

 import com.group.model.Order;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;

 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
 import java.util.List;

 @Repository
 @Transactional
 public class OrderDaoImpl implements OrderDao {

     private EntityManager entityManager;

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

     @Override
     public Order find(Integer id) {
         Order order = entityManager.find(Order.class, id);
         return order;
     }

     @Override
     public List<Order> findAll() {
         Query query = entityManager.createQuery("select o from Order o");
         return query.getResultList();
     }

     @Override
     public List<Order> findBySymbol(String symbol) {
         Query query = entityManager.createQuery("select o from Order o where o.symbol = :symbol");
         return query.setParameter("symbol", symbol).getResultList();
     }
 }

【问题讨论】:

  • 您的DAO 在服务类中是如何使用的?给出一个使用DAO的类的代码

标签: hibernate spring jpa annotations entitymanager


【解决方案1】:

您是否尝试将 unitName="MyServer" 添加到您的 @PersistenceContext 注释中?

【讨论】:

    【解决方案2】:

    使用org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor

    【讨论】:

      【解决方案3】:

      只是一个想法...您是否在 web.xml 中有此条目

      <servlet>
              <servlet-name>dispatcher</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:/META-INF/spring-context.xml</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
      </servlet>
      

      这将确保您的 spring 上下文已加载,并且所有对象都由 spring 容器注入...如果您错过了,请尝试...

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 2015-08-11
        • 2017-04-07
        • 2015-08-25
        • 2014-10-06
        • 2012-01-30
        相关资源
        最近更新 更多