Spring - Tomcat - Hibernate Transaction not committed with new Entity
falgan Feb 15, 2010 2:36 PMHi;
I am relatively new to Seam and I have a strange situation here. I am using Tomcat, Hibernate(not JPA), and Spring integration for Data Access Layer(DAO).. Below are snippets from my config;
Hibernate-config:
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="connection.datasource">java:comp/env/jdbc/csv</property>
<property name="transaction.flush_before_completion">true</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="query.substitutions">true</property>
<property name="use_outer_join">true</property>
<property name="max_fetch_depth">5</property>
<property name="bytecode.use_reflection_optimizer">true</property>
<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
components.xml:
<core:manager concurrent-request-timeout="500"
conversation-timeout="120000" conversation-id-parameter="cid"
parent-conversation-id-parameter="pid"/>
<spring:context-loader config-locations="/WEB-INF/csvApplicationContext.xml"/>
<persistence:hibernate-session-factory name="csvSessionFactory" />
<persistence:managed-hibernate-session name="csvHibernateSession" session -factory="#{csvSessionFactory}" />
<transaction:hibernate-transaction session="#{csvHibernateSession}" />
Spring ApplicationContext:
<bean id="csvSessionFactory" class="org.jboss.seam.ioc.spring.SeamManagedSessionFactoryBean">
<property name="sessionName" value="csvHibernateSession"/>
</bean>
<bean id="csvHibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="csvSessionFactory"/>
</property>
</bean>
<bean id="csvDaoTemplate" abstract="true">
<property name="hibernateTemplate">
<ref bean="csvHibernateTemplate"/>
</property>
</bean>
<bean id="securityDao" class="csv.security.dao.SecurityDao" parent="csvDaoTemplate"/>
Now, I have a pages scoped POJO service layer object which queries, updates and deletes Module entities.
@Name("moduleListAction")
@Scope(ScopeType.PAGE)
public class ModuleListAction implements Serializable {
@Logger
private Log logger;
@In
FacesMessages facesMessages;
@In("#{securityDao}")
private SecurityDao securityDao;
@DataModel
private List<Module> moduleList;
@DataModelSelection()
private Module selectedModule = new Module();
@Factory(value="moduleList")
public void searchModules() {
moduleList = securityDao.findAllModules();
}
public void editModule() {
logger.debug("Editing Module: " + selectedModule.getModuleName());
}
public void newModule() {
selectedModule = new Module();
}
public void deleteModule() {
securityDao.delete(selectedModule);
moduleList = null;
}
public void saveModule() {
securityDao.saveOrUpdate(selectedModule);
moduleList = null;
}
}
Now, when I click editModule from the web page, the editModule() is called. It principally does nothing because the selected module object is already caught by @DataModelSelection.
When I clieck newModule from the web page, a new Module object is created, so that when saveModule() is clicked on the next request, it can be saved.
The strange thing is the edit functionality works OK here, but when I try to create a new module, the transaction is not committed, though in both cases it is the same method that is called(saveModule)..
Below is a trace of my log file, when trying to create a new Module:
|15/02 14:58:39 DEBUG - SeamPhaseListener.begin(592) | beginning transaction prior to phase: APPLY_REQUEST_VALUES 2
15/02 14:58:39 DEBUG - HibernateTransaction.begin(78) | beginning Hibernate transaction
15/02 14:58:39 DEBUG - SessionImpl.<init>(247) | opened session at timestamp: 5186513795604480
15/02 14:58:39 DEBUG - ManagedHibernateSession.initSession(96) | created seam managed session for session factory: java:/csvHibernateSession
15/02 14:58:39 DEBUG - JDBCTransaction.begin(82) | begin
15/02 14:58:39 DEBUG - ConnectionManager.openConnection(444) | opening JDBC connection
15/02 14:58:39 DEBUG - JDBCTransaction.begin(87) | current autocommit status: true
15/02 14:58:39 DEBUG - JDBCTransaction.begin(90) | disabling autocommit
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - Component.getValueToInject(2298) | trying to inject with hierarchical context search: facesMessages
15/02 14:58:39 DEBUG - Component.getValueToInject(2290) | trying to inject with EL expression: #{securityDao}
15/02 14:58:39 DEBUG - AbstractBeanFactory.doGetBean(214) | Returning cached instance of singleton bean 'securityDao'
15/02 14:58:39 DEBUG - Component.injectDataModelSelection(1637) | selected row: null
15/02 14:58:39 DEBUG - SessionFactoryUtils.doGetSession(318) | Opening Hibernate Session
15/02 14:58:39 DEBUG - SeamLifecycleUtils.beginTransactionalSeamCall(33) | Application available. Won't start a new call
15/02 14:58:39 DEBUG - HibernateTransaction.registerSynchronization(184) | registering synchronization: ManagedHibernateSession(java:/csvHibernateSession)
15/02 14:58:39 DEBUG - AbstractBatcher.logOpenPreparedStatement(410) | about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
15/02 14:58:39 DEBUG - SQLStatementLogger.logStatement(111) | select SEQ_SECURITY.nextval from dual
Hibernate: select SEQ_SECURITY.nextval from dual
15/02 14:58:39 DEBUG - SequenceGenerator.generate(105) | Sequence identifier generated: 1121
15/02 14:58:39 DEBUG - AbstractBatcher.logClosePreparedStatement(418) | about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
15/02 14:58:39 DEBUG - AbstractSaveEventListener.saveWithGeneratedId(135) | generated identifier: 1121, using strategy: org.hibernate.id.SequenceGenerator
15/02 14:58:39 DEBUG - HibernateAccessor.flushIfNecessary(389) | Eagerly flushing Hibernate session
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.prepareEntityFlushes(134) | processing flush-time cascades
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.prepareCollectionFlushes(177) | dirty checking collections
15/02 14:58:39 DEBUG - Collections.processReachableCollection(199) | Collection found: [csv.security.domain.Module.operations#1121], was: [<unreferenced>] (initialized)
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.flushEverythingToExecutions(108) | Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.flushEverythingToExecutions(114) | Flushed: 1 (re)creations, 0 updates, 0 removals to 1 collections
15/02 14:58:39 DEBUG - Printer.toString(106) | listing entities:
15/02 14:58:39 DEBUG - Printer.toString(113) | csv.security.domain.Module{id=1121, description=YTYYY, moduleName=XXXX, operations=[]}
15/02 14:58:39 DEBUG - AbstractBatcher.logOpenPreparedStatement(410) | about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
15/02 14:58:39 DEBUG - SQLStatementLogger.logStatement(111) | insert into MODULE (MODULENAME, DESCRIPTION, ID) values (?, ?, ?)
Hibernate: insert into MODULE (MODULENAME, DESCRIPTION, ID) values (?, ?, ?)
15/02 14:58:39 DEBUG - BatchingBatcher.doExecuteBatch(66) | Executing batch size: 1
15/02 14:58:39 DEBUG - Expectations$BasicExpectation.checkBatched(77) | success of batch update unknown: 0
15/02 14:58:39 DEBUG - AbstractBatcher.logClosePreparedStatement(418) | about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
15/02 14:58:39 DEBUG - SessionFactoryUtils.closeSession(789) | Closing Hibernate Session
15/02 14:58:39 DEBUG - SeamManagedSessionFactoryBean$SeamManagedSessionHandler.invoke(292) | Closing Session Proxy.
15/02 14:58:39 DEBUG - SessionImpl.disconnect(401) | disconnecting session
15/02 14:58:39 DEBUG - ConnectionManager.closeConnection(464) | releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
15/02 14:58:39 DEBUG - SeamPhaseListener.commitOrRollback(612) | committing transaction after phase: INVOKE_APPLICATION 5
15/02 14:58:39 DEBUG - HibernateTransaction.commit(95) | committing Hibernate transaction
15/02 14:58:39 DEBUG - JDBCTransaction.commit(134) | commit
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.prepareEntityFlushes(134) | processing flush-time cascades
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.prepareCollectionFlushes(177) | dirty checking collections
15/02 14:58:39 DEBUG - Collections.processReachableCollection(199) | Collection found: [csv.security.domain.Module.operations#1121], was: [csv.security.domain.Module.operations#1121] (initialized)
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.flushEverythingToExecutions(108) | Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
15/02 14:58:39 DEBUG - AbstractFlushingEventListener.flushEverythingToExecutions(114) | Flushed: 0 (re)creations, 0 updates, 0 removals to 1 collections
15/02 14:58:39 DEBUG - Printer.toString(106) | listing entities:
15/02 14:58:39 DEBUG - Printer.toString(113) | csv.security.domain.Module{id=1121, description=YTYYY, moduleName=XXXX, operations=[]}
15/02 14:58:39 DEBUG - ConnectionManager.openConnection(444) | opening JDBC connection
15/02 14:58:39 DEBUG - JDBCTransaction.toggleAutoCommit(227) | re-enabling autocommit
15/02 14:58:39 DEBUG - JDBCTransaction.commit(147) | committed JDBC Connection
15/02 14:58:39 DEBUG - ConnectionManager.aggressiveRelease(427) | aggressively releasing JDBC connection
15/02 14:58:39 DEBUG - ConnectionManager.closeConnection(464) | releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
15/02 14:58:39 DEBUG - Resources.getResource(109) | Loaded resource from context classloader: jar:file:/D:/RHDSWorkspaces/MCel/CSV2/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/CSV/WEB-INF/lib/jboss-seam-debug.jar!/META-INF/debug.xhtml
15/02 14:58:39 DEBUG - SeamPhaseListener.begin(592) | beginning transaction prior to phase: RENDER_RESPONSE 6
....|from the logs, I see that hibernate flushes the entity, and the statements are executed. But nothing appears on my database.
Can anybody give me a clue of what I am doing wrong?
Regards,
Fatih