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