繁体   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