[英]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.