liren
Jan 19th, 2005, 10:28 AM
Hi everyone:
I want to use HibernateTransaction in Spring. But it couldn't insert data into database.
my config file is:
<bean id="MyDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/Hibernate?useUnicode=true&characterEncoding=gb2312</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
<property name="defaultAutoCommit">
<value>false</value>
</property>
</bean>
<!--
<bean id="MyJNDIDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/mysql</value>
</property>
</bean>
-->
<bean id="MySessionFactory" class="org.springframework.orm.hibernate.LocalSessionFact oryBean">
<property name="mappingResources">
<list>
<value>lyo/hotmail/site/bean/Article.hbm.xml</value>
<value>lyo/hotmail/site/bean/Forum.hbm.xml</value>
<value>lyo/hotmail/site/bean/Message.hbm.xml</value>
<value>lyo/hotmail/site/bean/User.hbm.xml</value>
<value>lyo/hotmail/site/bean/UserDetail.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.query.substitutions">true=1 false=0</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.use_outer_join">false</prop>
</props>
</property>
<property name="dataSource"><ref bean="MyDataSource"/></property>
</bean>
<bean id="fproxy" class="lyo.hotmail.site.util.ForumProxy">
<property name="fdao">
<ref bean="formDao"/>
</property>
</bean>
<bean id="viewSpringForumController" class="lyo.hotmail.site.action.ViewForumcontroller">
<property name="forumProxy">
<ref bean="fproxy"/>
</property>
</bean>
<bean id="rewriteURLController" class="lyo.hotmail.site.action.DispatchForumController">
<property name="fdao">
<ref bean="formDao"/>
</property>
</bean>
<bean id="postArticleController" class="lyo.hotmail.site.action.PostArticleController">
<property name="fdao">
<ref bean="formDao"/>
</property>
</bean>
<bean id="viewDetailController" class="lyo.hotmail.site.action.viewDetailController">
<property name="forumProxy">
<ref bean="fproxy"/>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlH andlerMapping">
<property name="mappings">
<props>
<prop key="/oldForum.spring">viewSpringForumController</prop>
<prop key="/viewForum.spring">viewSpringForumController</prop>
<prop key="/detail.spring">viewDetailController</prop>
<prop key="/newPost.spring">rewriteURLController</prop>
<prop key="/post.spring">postArticleController</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResou rceViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/WEB-INF/forum/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
<bean id="formDao" class="lyo.hotmail.site.service.ForumDAOImpl">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
<property name="udao">
<ref bean="userDao"/>
</property>
</bean>
<bean id="userDao" class="lyo.hotmail.site.service.UserDAOImpl">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
</bean>
<bean id="msgDao" class="lyo.hotmail.site.service.MessageDAOImpl">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
<property name="messageDao">
<ref bean="msgDao"/>
</property>
</bean>
<bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransac tionManager">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
</bean>
<bean id="myTransactionInterceptor" class="org.springframework.transaction.interceptor.Transa ctionInterceptor">
<property name="transactionManager">
<ref bean="myTransactionManager"/>
</property>
<property name="transactionAttributeSource">
<value>
lyo.hotmail.site.service.MessageDAOImpl.sendMsgTra nsaction=PROPAGATION_MANDATORY
</value>
</property>
</bean>
<bean id="myProductService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>lyo.hotmail.site.dao.MessageDAO</value>
</property>
<property name="interceptorNames">
<value>myTransactionInterceptor,msgDao</value>
</property>
</bean>
If I set :
<property name="defaultAutoCommit">
<value>true</value>
</property>
Spring will report error:
Can't call commit when autoCommit is true.
So I set autoCommit to false(I don't know why ;-( ).
My class is:
public class MessageDAOImpl extends HibernateDaoSupport implements MessageDAO {
.................................................. ....................................
public boolean sendMsg(final Message msg,final Long userID) {
HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory());
User user= (User) hibernateTemplate.execute(
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
User user=(User)session.get(User.class,userID);
msg.setUser(user);
Set msgSet=user.getMessageSet();
if(null!=msgSet){
msgSet.add(msg);
}else{
msgSet=new HashSet();
msgSet.add(msg);
}
user.setMessageSet(msgSet);
session.update(user);
return null;
}
});
return true;
}
/***
* send message transaction */
public boolean sendMsgTransaction(final Message msg,final Long userID){
this.getMessageDao().sendMsg(msg,userID);
return true;
}
.................................................. .........................
MessageDao class:
public interface MessageDAO {
.................................................. ................................ public boolean sendMsg(Message msg,Long userID);
public boolean sendMsg(Message msg,String userName);
public boolean sendMsgTransaction(final Message msg,final Long userID);
}
When I run it in Tomcat ,console output :
.................................................. .....................
00:08:36,313 INFO SettingsFactory:103 - Use scrollable result sets: true
00:08:36,323 INFO SettingsFactory:106 - Use JDBC3 getGeneratedKeys(): true
00:08:36,323 INFO SettingsFactory:109 - Optimize cache for minimal puts: false
00:08:36,323 INFO SettingsFactory:115 - echoing all SQL to stdout
00:08:36,323 INFO SettingsFactory:118 - Query language substitutions: {no='N',
true=1, yes='Y', false=0}
00:08:36,323 INFO SettingsFactory:129 - cache provider: net.sf.hibernate.cache.
EhCacheProvider
00:08:36,323 INFO Configuration:1116 - instantiating and configuring caches
00:08:36,323 INFO SessionFactoryImpl:118 - building session factory
00:08:36,403 INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI,
no JNDI name configured
00:08:46,587 INFO PropertyMessageResources:127 - Initializing, config='org.apac
he.struts.actions.LocalStrings', returnNull=true
00:08:46,607 INFO SQLErrorCodesFactory:197 - Looking up default SQLErrorCodes f
or DataSource
00:08:46,607 INFO SQLErrorCodesFactory:202 - Database product name found in cac
he for DataSource [org.apache.commons.dbcp.BasicDataSource@130c13 2]. Name is 'My
SQL'.
Hibernate: select user0_.USER_ID as USER_ID0_, user0_.USER_GRADE as USER_GRADE0_
, user0_.USER_NAME as USER_NAME0_, user0_.USER_PASSWORD as USER_PAS4_0_ from use
r user0_ where user0_.USER_ID=?
Hibernate: select messageset0_.USER_ID as USER_ID__, messageset0_.MESSAGE_ID as
MESSAGE_ID__, messageset0_.MESSAGE_ID as MESSAGE_ID0_, messageset0_.MESSAGE_CONT
ENT as MESSAGE_2_0_, messageset0_.MESSAGE_TITLE as MESSAGE_3_0_, messageset0_.SE
ND_TIME as SEND_TIME0_, messageset0_.SENDER as SENDER0_, messageset0_.USER_ID as
USER_ID0_ from message messageset0_ where messageset0_.USER_ID=?
Hibernate: insert into message (MESSAGE_CONTENT, MESSAGE_TITLE, SEND_TIME, SENDE
R, USER_ID, MESSAGE_ID) values (?, ?, ?, ?, ?, ?)
Not any exception happen,But no data inserted ! Why spring couldn't insert data into database? Thks
I want to use HibernateTransaction in Spring. But it couldn't insert data into database.
my config file is:
<bean id="MyDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/Hibernate?useUnicode=true&characterEncoding=gb2312</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
<property name="defaultAutoCommit">
<value>false</value>
</property>
</bean>
<!--
<bean id="MyJNDIDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/mysql</value>
</property>
</bean>
-->
<bean id="MySessionFactory" class="org.springframework.orm.hibernate.LocalSessionFact oryBean">
<property name="mappingResources">
<list>
<value>lyo/hotmail/site/bean/Article.hbm.xml</value>
<value>lyo/hotmail/site/bean/Forum.hbm.xml</value>
<value>lyo/hotmail/site/bean/Message.hbm.xml</value>
<value>lyo/hotmail/site/bean/User.hbm.xml</value>
<value>lyo/hotmail/site/bean/UserDetail.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.query.substitutions">true=1 false=0</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.use_outer_join">false</prop>
</props>
</property>
<property name="dataSource"><ref bean="MyDataSource"/></property>
</bean>
<bean id="fproxy" class="lyo.hotmail.site.util.ForumProxy">
<property name="fdao">
<ref bean="formDao"/>
</property>
</bean>
<bean id="viewSpringForumController" class="lyo.hotmail.site.action.ViewForumcontroller">
<property name="forumProxy">
<ref bean="fproxy"/>
</property>
</bean>
<bean id="rewriteURLController" class="lyo.hotmail.site.action.DispatchForumController">
<property name="fdao">
<ref bean="formDao"/>
</property>
</bean>
<bean id="postArticleController" class="lyo.hotmail.site.action.PostArticleController">
<property name="fdao">
<ref bean="formDao"/>
</property>
</bean>
<bean id="viewDetailController" class="lyo.hotmail.site.action.viewDetailController">
<property name="forumProxy">
<ref bean="fproxy"/>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlH andlerMapping">
<property name="mappings">
<props>
<prop key="/oldForum.spring">viewSpringForumController</prop>
<prop key="/viewForum.spring">viewSpringForumController</prop>
<prop key="/detail.spring">viewDetailController</prop>
<prop key="/newPost.spring">rewriteURLController</prop>
<prop key="/post.spring">postArticleController</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResou rceViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/WEB-INF/forum/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
<bean id="formDao" class="lyo.hotmail.site.service.ForumDAOImpl">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
<property name="udao">
<ref bean="userDao"/>
</property>
</bean>
<bean id="userDao" class="lyo.hotmail.site.service.UserDAOImpl">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
</bean>
<bean id="msgDao" class="lyo.hotmail.site.service.MessageDAOImpl">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
<property name="messageDao">
<ref bean="msgDao"/>
</property>
</bean>
<bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransac tionManager">
<property name="sessionFactory">
<ref bean="MySessionFactory"/>
</property>
</bean>
<bean id="myTransactionInterceptor" class="org.springframework.transaction.interceptor.Transa ctionInterceptor">
<property name="transactionManager">
<ref bean="myTransactionManager"/>
</property>
<property name="transactionAttributeSource">
<value>
lyo.hotmail.site.service.MessageDAOImpl.sendMsgTra nsaction=PROPAGATION_MANDATORY
</value>
</property>
</bean>
<bean id="myProductService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>lyo.hotmail.site.dao.MessageDAO</value>
</property>
<property name="interceptorNames">
<value>myTransactionInterceptor,msgDao</value>
</property>
</bean>
If I set :
<property name="defaultAutoCommit">
<value>true</value>
</property>
Spring will report error:
Can't call commit when autoCommit is true.
So I set autoCommit to false(I don't know why ;-( ).
My class is:
public class MessageDAOImpl extends HibernateDaoSupport implements MessageDAO {
.................................................. ....................................
public boolean sendMsg(final Message msg,final Long userID) {
HibernateTemplate hibernateTemplate = new HibernateTemplate(this.getSessionFactory());
User user= (User) hibernateTemplate.execute(
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
User user=(User)session.get(User.class,userID);
msg.setUser(user);
Set msgSet=user.getMessageSet();
if(null!=msgSet){
msgSet.add(msg);
}else{
msgSet=new HashSet();
msgSet.add(msg);
}
user.setMessageSet(msgSet);
session.update(user);
return null;
}
});
return true;
}
/***
* send message transaction */
public boolean sendMsgTransaction(final Message msg,final Long userID){
this.getMessageDao().sendMsg(msg,userID);
return true;
}
.................................................. .........................
MessageDao class:
public interface MessageDAO {
.................................................. ................................ public boolean sendMsg(Message msg,Long userID);
public boolean sendMsg(Message msg,String userName);
public boolean sendMsgTransaction(final Message msg,final Long userID);
}
When I run it in Tomcat ,console output :
.................................................. .....................
00:08:36,313 INFO SettingsFactory:103 - Use scrollable result sets: true
00:08:36,323 INFO SettingsFactory:106 - Use JDBC3 getGeneratedKeys(): true
00:08:36,323 INFO SettingsFactory:109 - Optimize cache for minimal puts: false
00:08:36,323 INFO SettingsFactory:115 - echoing all SQL to stdout
00:08:36,323 INFO SettingsFactory:118 - Query language substitutions: {no='N',
true=1, yes='Y', false=0}
00:08:36,323 INFO SettingsFactory:129 - cache provider: net.sf.hibernate.cache.
EhCacheProvider
00:08:36,323 INFO Configuration:1116 - instantiating and configuring caches
00:08:36,323 INFO SessionFactoryImpl:118 - building session factory
00:08:36,403 INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI,
no JNDI name configured
00:08:46,587 INFO PropertyMessageResources:127 - Initializing, config='org.apac
he.struts.actions.LocalStrings', returnNull=true
00:08:46,607 INFO SQLErrorCodesFactory:197 - Looking up default SQLErrorCodes f
or DataSource
00:08:46,607 INFO SQLErrorCodesFactory:202 - Database product name found in cac
he for DataSource [org.apache.commons.dbcp.BasicDataSource@130c13 2]. Name is 'My
SQL'.
Hibernate: select user0_.USER_ID as USER_ID0_, user0_.USER_GRADE as USER_GRADE0_
, user0_.USER_NAME as USER_NAME0_, user0_.USER_PASSWORD as USER_PAS4_0_ from use
r user0_ where user0_.USER_ID=?
Hibernate: select messageset0_.USER_ID as USER_ID__, messageset0_.MESSAGE_ID as
MESSAGE_ID__, messageset0_.MESSAGE_ID as MESSAGE_ID0_, messageset0_.MESSAGE_CONT
ENT as MESSAGE_2_0_, messageset0_.MESSAGE_TITLE as MESSAGE_3_0_, messageset0_.SE
ND_TIME as SEND_TIME0_, messageset0_.SENDER as SENDER0_, messageset0_.USER_ID as
USER_ID0_ from message messageset0_ where messageset0_.USER_ID=?
Hibernate: insert into message (MESSAGE_CONTENT, MESSAGE_TITLE, SEND_TIME, SENDE
R, USER_ID, MESSAGE_ID) values (?, ?, ?, ?, ?, ?)
Not any exception happen,But no data inserted ! Why spring couldn't insert data into database? Thks