簡體   English   中英

使用Spring vs Java EE 6注入JPA EntityManager

[英]Injecting JPA EntityManager using Spring vs Java EE 6

我是Java EE 6的新手,甚至是Spring的新手。 我正在嘗試注入EclipseLink JPA EntityManager,並正在探索實現此目標的不同方法。 我正在使用Glassfish和Derby。 在下面的示例中,為了簡化起見,我嘗試將EntityManager直接注入到servlet或控制器中,實際上,我將擁有一個包裝EntityManager的DAO類。

在Java EE 6中,我可以如下定義servlet:

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

    @PersistenceContext
    private EntityManager entityManager;
}

無需進一步配置,即可正確注入EntityManager。

現在我想使用Spring,最好是通過注釋。 當前,我可以定義一個Controller如下:

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

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

為了使Spring正確連接起來,我需要在應用程序上下文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

讀完這篇文章后,我的印象是我不需要上面的XML代碼段。 任何人都可以確認是否始終需要上述代碼段嗎?

還有另一種方法-如果將EntityManager通過Java EE容器成功注入到我的FrontController servlet中,那么如何將相同的EntityManager注入到我的Spring應用程序上下文中並提供給其他spring bean?

將您的em注入服務層,而不是控制器。

一個簡短的代碼片段(使用hibernate4):

@Controller
public class AdminController {

    @Resource(name = "companyService")
    private CompanyService companyService;

    @RequestMapping(value = "/AllCompanies", method = RequestMethod.GET)
    public String getCompanies(final Model model) {
    final List<Company> companies = companyService.getAllCompanies();
    //dostuff
    }

和服務:

@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" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM