Strut+Spring+Hibernate应用,在一个Session中,先新增后删除,出现:Could not execute JDBC batch update错误。

若林林 2008-04-02 10:39:29
程序是基于Strut+Spring+Hibernate。

在一个Session中,先新增后删除,出现,Could not execute JDBC batch update错误。

错误:
org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Caused by: org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
..............


下面是程序:
-----------------------------------------------------------------------------

public class TestOrderServiceSpringImpl extends BaseTestCase {

public void testFindOrderById() {

IOrderService service = (IOrderService) super.getBean("orderService");

try {
Order order = service.findOrderById(1);
assertNotNull(order);

} catch (OrderException e) {
getLog().error(e);
e.printStackTrace();
}
}

public void testSaveNewOrder() throws Exception {

IOrderService service = (IOrderService) super.getBean("orderService");

try {
Order order = new Order();
order.setUserName("userName");

service.saveNewOrder(order);


int id = order.getId();

//super.tearDown();
//super.setUp();
加入这两条,后面的Hibernate操作在另一个session中执先就可以

service.deleteOrder(order); //执先这里出错。

order = null;

order = service.findOrderById(id);

assertNull(order);

} catch (OrderException e) {
getLog().error(e);
e.printStackTrace();
}
}
}

--------------------------------------------------------------------------------

public class BaseTestCase extends TestCase {

private static Log log = LogFactory.getLog(BaseTestCase.class);

private ApplicationContext ac;

SessionFactory sessionFactory;

protected void setUp() throws Exception {
super.setUp();

ac = new FileSystemXmlApplicationContext(
"D:/workspace/code/order/WebRoot/WEB-INF/config/spring/applicationContext.xml");

sessionFactory = (SessionFactory) getBean("mySessionFactory");
Session s = sessionFactory.openSession();
TransactionSynchronizationManager.bindResource(sessionFactory,
new SessionHolder(s));

}

protected void sessionFlush() throws Exception {

SessionHolder holder = (SessionHolder) TransactionSynchronizationManager
.getResource(sessionFactory);
Session s = holder.getSession();
s.flush();
}

protected void tearDown() throws Exception {
super.tearDown();

SessionHolder holder = (SessionHolder) TransactionSynchronizationManager
.getResource(sessionFactory);
Session s = holder.getSession();
s.flush();
TransactionSynchronizationManager.unbindResource(sessionFactory);
SessionFactoryUtils.closeSession(s);
}

protected Object getBean(String name) {
return ac.getBean(name);
}

public static Log getLog() {
return log;
}

}




...全文
1043 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
若林林 2008-04-02
  • 打赏
  • 举报
回复
原来为:

<!-- 配置事务策略 -->
<tx:advice id="txAdvice" transaction-manager="myTxManager">
<tx:attributes>
<tx:method name="find*" propagation="REQUIRED"
read-only="true" />
<tx:method name="save*" propagation="REQUIRED" />

<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
改成:
<!-- 配置事务策略 -->
<tx:advice id="txAdvice" transaction-manager="myTxManager">
<tx:attributes>
<tx:method name="find*" propagation="REQUIRED"
read-only="true" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>

现在是:
service.deleteOrder(order);
正常执行
assertNull(order);
没有通过


IOrderService service = (IOrderService) super.getBean("orderService");

try {
Order order = new Order();
order.setUserName("userName");

service.saveNewOrder(order);


int id = order.getId();

//super.tearDown();
//super.setUp(); 加入这两条,后面的Hibernate操作在另一个session中执先就可以

service.deleteOrder(order); //原来执先这里出错。

order = null;

order = service.findOrderById(id);

assertNull(order); //现在这里出错,还好是fail,不知道什么原因。session的一级缓存存的Order没有清空吗????



若林林 2008-04-02
  • 打赏
  • 举报
回复
log中找到如下错误。

[02-04-2008 11:23:14] ERROR [org.hibernate.util.JDBCExceptionReporter : logExceptions : 72] - Connection is read-only. Queries leading to data modification are not allowed 这个应是重点。 [02-04-2008 11:23:14] ERROR [org.hibernate.event.def.AbstractFlushingEventListener : performExecutions : 300] - Could not synchronize database state with session

[02-04-2008 11:23:14] DEBUG [org.springframework.transaction.support.AbstractPlatformTransactionManager : doRollbackOnCommitException : 679] - Initiating transaction rollback on commit exception org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Caused by:
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update







若林林 2008-04-02
  • 打赏
  • 举报
回复
int id = order.getId();
getLog().debug("id:" + id);

log4j的输出是:id有值
-----------------------
[02-04-2008 11:02:15] DEBUG [cn.hxex.order.service.spring.TestOrderServiceSpringImpl : testSaveNewOrder : 54] - id:18


ee4456 2008-04-02
  • 打赏
  • 举报
回复
好象是因为session.flush()吧。。你把session.clear()试试
傻根她弟 2008-04-02
  • 打赏
  • 举报
回复
int id = order.getId();

这个id取到了么?

详细报错帖出来吧
li_d_s 2008-04-02
  • 打赏
  • 举报
回复
错误信息不完整,另外还可以把show_sql设置好,打sql出来看看

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧