#
RoomType和RoomState的主鍵是Integer,在get的時候忘記轉換為Integer了:
????????
this
.getHibernateTemplate().execute(
new
?HibernateCallback()?{
????????????
public
?Object?doInHibernate(Session?session)?
throws
?HibernateException?{
????????????????room.setType((RoomType)?session.get(RoomType.
class
,?typeId));
????????????????room.setState((RoomState)?session.get(RoomState.
class
,?stateId));
????????????????session.update(room);
????????????????
return
?
null
;
????????????}
????????});
沒想到hibernate居然大動干做,拋出一大堆的exception
java.sql.SQLException:?索引中丟失??IN?或?OUT?參數::?1
????at?oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
????at?oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
????at?oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:1681)
????at?oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3280)
????at?oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
????at?org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)
????at?org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
????at?org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
????at?org.hibernate.loader.Loader.doQuery(Loader.java:662)
????at?org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
????at?org.hibernate.loader.Loader.doList(Loader.java:2145)
????at?org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
????at?org.hibernate.loader.Loader.list(Loader.java:2024)
????at?org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
????at?org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
????at?org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
????at?org.hibernate.impl.SessionImpl.list(SessionImpl.java:1129)
????at?org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
????at?org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:749)
????at?com.phopesoft.hms.room.service.impl.RoomServiceImpl$3.doInHibernate(RoomServiceImpl.java:151)
????at?org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
????at?org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:334)
這樣的錯誤真是讓我一點莫不著頭腦,還好從后臺打出的hql看到了錯誤的信息
org.springframework.jdbc.UncategorizedSQLException:?Hibernate?operation:
?could?not?execute?query;?uncategorized?SQLException?for?SQL?[
?...
?SQL?state?[null];?error?code?[17041];?索引中丟失??IN?或?OUT?參數::1;
?nested?exception?is?java.sql.SQLException:?索引中丟失??IN?或?OUT?參數::?1
不就是沒找到嗎,干嘛要這樣呢


將String類型轉換為Integer就沒事了
????????this.getHibernateTemplate().execute(new?HibernateCallback()?{
????????????public?Object?doInHibernate(Session?session)?throws?HibernateException?{
????????????????room.setType((RoomType)?session.get(RoomType.class,?new?Integer(typeId)));
????????????????room.setState((RoomState)?session.get(RoomState.class,?new?Integer(stateId)));
????????????????session.update(room);
????????????????return?null;
????????????}
????????});
在resin和weblogic上跑的很好的程序,今天早上移植到JBoss上?,頁面跑到<ww:if處沒法正常運行,報錯,換成<c:if 就沒有問題了.
一大早的被郁悶了一下
感謝javaeye差沙和cac的回復.
OpenSessionInView默認的FlushMode為
FlushMode.NEVER?
可以采用在寫保存更新刪除代碼的時候手動更改FlushMode
????????this.getHibernateTemplate().execute(new?HibernateCallback()?{?
????????????public?Object?doInHibernate(Session?session)?throws?HibernateException?{?
????????????????session.setFlushMode(FlushMode.AUTO);?
????????????????session.save(user);?
????????????????session.flush();?
????????????????return?null;?
????????????}?
????????});?
但是這樣做太繁瑣了,第二種方式是采用spring的事務聲明
????<bean?id="baseTransaction"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"?
??????????abstract="true">?
????????<property?name="transactionManager"?ref="transactionManager"/>?
????????<property?name="proxyTargetClass"?value="true"/>?
????????<property?name="transactionAttributes">?
????????????<props>?
????????????????<prop?key="get*">PROPAGATION_REQUIRED,readOnly</prop>?
????????????????<prop?key="find*">PROPAGATION_REQUIRED,readOnly</prop>?
????????????????<prop?key="load*">PROPAGATION_REQUIRED,readOnly</prop>?
????????????????<prop?key="save*">PROPAGATION_REQUIRED</prop>?
????????????????<prop?key="add*">PROPAGATION_REQUIRED</prop>?
????????????????<prop?key="update*">PROPAGATION_REQUIRED</prop>?
????????????????<prop?key="remove*">PROPAGATION_REQUIRED</prop>?
????????????</props>?
????????</property>?
????</bean>?
????<bean?id="userService"?parent="baseTransaction">?
????????<property?name="target">?
????????????<bean?class="com.phopesoft.security.service.impl.UserServiceImpl"/>?
????????</property>?
????</bean>?
因為lazy的問題,還是采用了OpenSessionInView
一開始我的web.xml配置文件如下:
????<filter>?
????????<filter-name>opensession</filter-name>?
????????<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>?
????</filter>?
寫了個保存的代碼測試了一下,報如下的錯誤:
org.springframework.dao.InvalidDataAccessApiUsageException:?Write?operations?
are?not?allowed?in?read-only?mode?(FlushMode.NEVER)?-?turn?your?Session?
into?FlushMode.AUTO?or?remove?'readOnly'?marker?from?transaction?definition?
????????at?org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1076)?
????????at?org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:616)?
????????at?org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)?
????????at?org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:614)?
????????at?com.phopesoft.security.service.impl.UserServiceImpl.addUser(UserServiceImpl.java:40)?
????????at?com.phopesoft.security.web.UserAction.add(UserAction.java:52)?
????????at?sun.reflect.NativeMethodAccessorImpl.invoke0(Native?Method)?
????????at?sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)?
????????at?sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)?
????????at?java.lang.reflect.Method.invoke(Method.java:585)?
????????at?com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:365)?




.?
在javaeye中搜索了一下,發現了Readonly的帖子,將web.xml修改為如下:
<filter>?
????????<filter-name>opensession</filter-name>?
????????<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>?
????????<init-param>?
????????????<param-name>singleSession</param-name>?
????????????<param-value>false</param-value>?
????????</init-param>?
????</filter>?
保存的代碼順利通過測試,但是刪除的代碼卻不能通過了.出現如下的錯誤:
org.hibernate.HibernateException:?Illegal?attempt?to?associate?a?collection?
with?two?open?sessions?
????????at?org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)?
????????at?org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:40)?
????????at?org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)?
????????at?org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)?
????????at?org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:55)?
????????at?org.hibernate.event.def.AbstractVisitor.process(AbstractVisitor.java:123)?
????????at?org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:72)?
????????at?org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:790)?
????????at?org.hibernate.impl.SessionImpl.delete(SessionImpl.java:768)?
????????at?org.springframework.orm.hibernate3.HibernateTemplate$25.doInHibernate(HibernateTemplate.java:772)?
????????at?org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)?
????????at?org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:766)?
????????at?org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:762)?
同樣在論壇里面搜索到遇到這個問題的朋友,回帖說去掉singleSession!
迷惑了
正好這段時間有空,開始研讀rails。本身我沒有ruby基礎,也一直沒有太大的興趣,這本書正好是對沒有ruby基礎人寫的rails教程。
Thanks manning:)