2012-02-09 185 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