2012-02-09 150 views
1

我是Java EE 6新手,甚至更新到Spring。我正在尝试注入EclipseLink JPA EntityManager,并且正在探索实现这一点的不同方式。我正在使用Glassfish和Derby。在下面的示例中,我试图将EntityManager直接注入到servlet或控制器中以实现简单性,实际上我将有一个包装EntityManager的DAO类。使用Spring vs Java EE注入JPA EntityManager 6

在Java EE 6,I可以如下定义一个servlet:

@WebServlet(urlPatterns="/app/*") 
public class FrontController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @PersistenceContext 
    private EntityManager entityManager; 
} 

实体管理正确,没有进一步的配置注入。

现在我想使用Spring,最好通过注释。目前,如下我可以定义一个控制器:

@Controller 
@RequestMapping("/testurl.htm") 
public class ExampleController { 
    private EntityManager em; 

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

为了春季正确连接东西,我需要在我的应用程序上下文XML文件中的下列指令:

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="myPU"/> 
</bean> 

如果我不包括上面的片段中,我得到上部署一个例外: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0

看了this我的印象是我不需要以上的XML片段。任何人都可以确认,如果上述片段将永远是必需的?是否有另一种方法 - 如果一个EntityManager被Java EE容器成功注入到我的FrontController servlet中,那么如何将这个相同的EntityManager注入到我的Spring应用程序上下文中并将其提供给其他spring bean?

+2

注入你的EM到服务层,而不是你控制器 – NimChimpsky 2012-02-09 11:56:20

回答

0

注入你的服务层,而不是你的控制器。

一个简短的片段(使用hibernate4):

​​

和服务:

@Service("companyService") 
@Transactional 
public class CompanyService { 

    @Resource(name = "sessionFactory") 
    private SessionFactory sessionFactory; 

    @Transactional(readOnly = true) 
    public List<Company> getAllCompanies() { 
    final Session session = sessionFactory.getCurrentSession(); 
//... do stuff 
} 

和应用方面的相关位

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     p:dataSource-ref="dataSource" p:configLocation="WEB-INF/classes/hibernate.cfg.xml" 
     p:packagesToScan="com.mypackage" /> 

    <!-- Declare a datasource that has pooling capabilities --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     ... /> 

    <!-- Declare a transaction manager --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
       p:sessionFactory-ref="sessionFactory" /> 
+0

谢谢,但这不是我所追求的(正如我所说的,我打算在注入工作后使用DAO S)。在我发布的[link](http://static.springsource.org/spring/docs/2.5.x/reference/orm.html#orm-jpa-straight)中,他们的'ProductDaoImpl'没有任何Spring依赖关系。他们的应用上下文xml也没有任何实体管理器声明,暗示使用默认的(JEE-容器提供的?)实体管理器工厂。 – zorgbargle 2012-02-09 13:34:15

+0

@zorgbargle一个dao与一个服务类/层不同,您将dao注入服务层,并将其注入到控制器中。这是2.5的春天btw,它现在达到3.1。 – NimChimpsky 2012-02-09 13:44:19

+0

谢谢,我意识到他们是不同的,但我不认为它改变了我想要做的事情,这是得到底层注入机制的工作。如果我介绍一个服务层,当Spring试图构建服务层时,我会得到相同的异常。编辑:对不起 - 现在只看到你的第二个反应 - 我不知道AOP如何改变我应该/不应该做的[spring-noob!] – zorgbargle 2012-02-09 13:55:59