HI,
I have created a JPA project using EclipseLink JPA 1.x version and deployed in ServiceMix OSGI server 4.X running Apache Felix Server. The project consists of several bundles : model, dao and service layer. To define services as transactional, I have used the annotation @Transactional. Unfortunately, the transaction is not started and not committed when I call the method of my service (bundle Service). It works fine when @Transactional is defined in the bundle DAO.
Remark : I use Spring DM 1.2. and Spring 2.5.6.SECO1
Can someone tell me what I doing wrong (if this is the case) ?
It should be interesting that the Petclinic example implements also a Service layer ;-)
A. Bundle Service
1) Class Service
2) Spring@Service("sapService")
@Transactional
public class PersistenceImpl implements Persistence {
@Autowired
private SapDocumentDAO sapDocumentDAO;
@Transactional
public void save(@Body final FinishedTireDocument finishedTiredDocument, Exchange exch) {
getSapDocumentDAO().save(finishedTiredDocument);
}
B. Bundle DAO<context:annotation-config/>
<context:component-scan base-package="com.goodyear.emea.gicl.esb.service.impl"/>
<tx:annotation-driven transaction-manager="txManager" mode="aspectj"/>
<!-- Get Transaction Manager from OSGI Services -->
<osgi:reference id="txManager" interface="org.springframework.transaction.Platfor mTransactionManager" />
<!-- Get DAO from OSGI Services -->
<osgi:reference id="sapDocumentDAO" interface="com.goodyear.emea.gicl.esb.persistence. SapDocumentDAO" />
<!-- Expose Persistence as a Service -->
<osgi:service ref="sapService" interface="com.goodyear.emea.gicl.esb.service.Pers istence" />
</beans>
1) Class DAO
2) Spring@Repository("sapDocumentDAO")
public class SapDocumentDAOImpl implements SapDocumentDAO {
private EntityManager em;
@PersistenceContext
public void setEntityManager(EntityManager em) {
this.em = em;
}
public SapDocumentDAOImpl() {
// System.out.println(">>> SapDocumentDAOImpl instantiated");
}
public void save(FinishedTireDocument finishedTiredDocument) {
Kind regards,<context:annotation-config />
<context:component-scan base-package="com.goodyear.emea.gicl.esb.persistence.im pl"/>
<bean class="org.springframework.orm.jpa.support.Persist enceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.Persiste nceExceptionTranslationPostProcessor"/>
<!-- Can be used with a DataSource -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerE ntityManagerFactoryBean">
<property name="persistenceUnitName" value="sap" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="username" value="sap"/>
<property name="password" value="sap"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/sapdb"/>
</bean>
<!-- EclipseLink adapter -->
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.EclipseL inkJpaVendorAdapter">
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.M ySQLPlatform" />
<property name="database" value="MYSQL" />
</bean>
<!-- Expose DAO as OSGI service -->
<osgi:service ref="sapDocumentDAO" interface="com.goodyear.emea.gicl.esb.persistence. SapDocumentDAO"/>
<!-- TransactionManager is required -->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionM anager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- Expose TxManager/Template as OSGI Service -->
<osgi:service ref="txManager" interface="org.springframework.transaction.Platfor mTransactionManager"/>
</beans>
Charles


