This has probably something to do with you're persistence configuration. If you are using EclipseLink, try setting some properties such as
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="jpaProperties"> <props> <prop key="eclipselink.logging.level" value="FINEST"/> <prop key="eclipselink.target-database" value="Database"/> <prop key="eclipselink.target-server" value="Server"/> <prop key="eclipselink.cache.shared.default" value="false"/> </props> </property> <property name="persistenceUnitName" value="MIAS-EJB"/> </bean> The last property is the most important, that is, set cache sharing to false. This does not function properly on most servers (the server where it does is OC4J) -----Original message----- From: Bart Kummel <[email protected]> Sent: Sun 09-08-2009 16:34 To: MyFaces Discussion <[email protected]>; Subject: [Orchestra] Transaction not committed Hi, I have set up an application with MyFaces Orchestra. It seems to work fine, except that no transaction is committed at the end of the conversation. I tried both "access" and "manual" conversation scopes, both with the same result. I'm probably missing something. Can someone assist me a little bit here? Below are some snippets from the most important files in my project. Best regards, Bart Kummel applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...> <!-- 1. initialization of all orchestra modules (required for core15 module) --> <import resource="classpath*:/META-INF/spring-orchestra-init.xml" /> <!-- 2. the conversation scopes --> <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> <property name="scopes"> <map> <entry key="conversation.manual"> <bean class="org.apache.myfaces.orchestra.conversation.spring.SpringConversationScope"> <property name="timeout" value="30" /> <property name="advices"> <list> <ref bean="persistentContextConversationInterceptor"/> </list> </property> </bean> </entry> <entry key="conversation.access"> <bean class="org.apache.myfaces.orchestra.conversation.spring.SpringConversationScope"> <property name="timeout" value="30" /> <property name="advices"> <list> <ref bean="persistentContextConversationInterceptor"/> </list> </property> <property name="lifetime" value="access"/> </bean> </entry> </map> </property> </bean> <!-- 3. the "entity manager" manager --> <bean id="persistentContextConversationInterceptor" class="org.apache.myfaces.orchestra.conversation.spring.PersistenceContextConversationInterceptor"> <property name="persistenceContextFactory" ref="persistentContextFactory"/> </bean> <!-- 4. conversation - persistence adapter --> <bean id="persistentContextFactory" class="org.apache.myfaces.orchestra.conversation.spring.JpaPersistenceContextFactory"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!-- 5. persistence --> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> <tx:annotation-driven /> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="MIAS-EJB"/> </bean> <bean name="editKidController" class="inc.monsters.mias.controller.EditKidController" scope="conversation.manual" autowire="byName"/> <bean name="editKidForm" class="inc.monsters.mias.backing.EditKidForm" scope="request" autowire="byName"/> <bean name="editScaredForm" class="inc.monsters.mias.backing.EditScaredForm" scope="request" autowire="byName"/> <bean name="kidsTable" class="inc.monsters.mias.backing.KidsTable" scope="request" autowire="byName"/> <!-- Enable injection for @EJB annotations --> <context:component-scan base-package="inc.monsters.mias" /> </beans> EditKidController.java: package inc.monsters.mias.controller; public class EditKidController { @EJB(mappedName="mias/KidService") private KidService service; private Kid selectedKid; public Kid getSelectedKid() { if(null == selectedKid) { FacesContext context = FacesContext.getCurrentInstance(); selectedKid = (Kid)context.getExternalContext().getRequestMap().get("selectedKid"); } return selectedKid; } public void setSelectedKid(Kid selectedKid) { this.selectedKid = selectedKid; } @Transactional public void saveSelected(ActionEvent event) { Kid k = getSelectedKid(); log.fine("Saving kid " + k.getId() + ": " + k.getFirstName() + " " + k.getLastName() + "."); if(service.existsKid(k)) { service.updateKid(k); } else { service.addKid(k); } } @Transactional public void updateScareData(ActionEvent event) { Kid k = getSelectedKid(); k.getEmployee().setKidsScared(k.getEmployee().getKidsScared() + 1); } public void endConversationAndSave(ActionEvent event) { saveSelected(event); endConversation(event); } public void endConversation(ActionEvent event) { Conversation.getCurrentInstance().invalidate(); } } EditKidForm.java: package inc.monsters.mias.backing; @ViewController(viewIds={"EditKid.xhtml"}) public class EditKidForm { private EditKidController editKidController; public EditKidController getEditKidController() { return editKidController; } public void setEditKidController(EditKidController controller) { this.editKidController = controller; } } EditKid.xhtml: <?xml version="1.0" encoding="UTF-8" ?> <tr:document ...> <ui:composition template="templates/template.xhtml"> <ui:define name="title">Edit kid</ui:define> <ui:define name="content"> <tr:panelFormLayout> ... <f:facet name="footer"> <tr:panelButtonBar halign="right"> <tr:commandButton text="#{msg.apply}" id="btnApply" partialSubmit="false" action="apply" actionListener="#{editKidForm.editKidController.saveSelected}"/> <tr:commandButton text="#{msg.ok}" action="ok" actionListener="#{editKidForm.editKidController.endConversationAndSave}" /> <tr:commandButton text="#{msg.cancel}" action="cancel" immediate="true" actionListener="#{editKidForm.editKidController.endConversation}" /> </tr:panelButtonBar> </f:facet> </tr:panelFormLayout> </ui:define> </ui:composition> The EditKid.xhtml page is called from the Kids.xhtml page: <?xml version="1.0" encoding="UTF-8" ?> <tr:document ...> <ui:composition template="templates/template.xhtml"> <ui:define name="title">Overview of kids!</ui:define> <ui:define name="content"> <tr:table var="kid" value="#{kidsTable.kids}" rows="20" id="kids" rowBandingInterval="1" horizontalGridVisible="false" allDetailsEnabled="true" rowSelection="multiple" binding="#{kidsTable.table}" selectionListener="#{kidsTable.selectionChanged}" autoSubmit="true" partialSubmit="true" > <mias:column .../> ... <mias:column columnName="edit" headerName="emptyTableHeader" custom="true"> <tr:commandLink action="edit" immediate="true"> <tr:image source="../images/pencil.png" inlineStyle="border-width: 0px;" /> <tr:setActionListener to="#{requestScope.selectedKid}" from="#{kid}"/> </tr:commandLink> </mias:column> </tr:table> </ui:define> </ui:composition> </tr:document>

