hibernate 使用update是抛出异常:Batch update returned unexpected row count from update:

long5000 2009-11-22 09:56:59
我就是想从数据库(mysql)中查出对象后,更改它的一些属性,用update方法更新这个对象,就抛出下面一大堆异常!这是怎么回事啊?
异常如下:
21:24:25,718 ERROR AbstractBatcher:61 - Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1009)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:356)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at util.HibernateUtil.commit(HibernateUtil.java:25)
at dao.UserDao.update(UserDao.java:131)
at face.LoginFrame$ButtonAction.actionPerformed(LoginFrame.java:639)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6216)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
21:24:25,734 ERROR AbstractFlushingEventListener:299 - Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1009)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:356)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at util.HibernateUtil.commit(HibernateUtil.java:25)
at dao.UserDao.update(UserDao.java:131)
at face.LoginFrame$ButtonAction.actionPerformed(LoginFrame.java:639)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6216)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

//下面是我自己写的一些函数:
//UserDao中的update方法:

public void update(User user) {
HibernateUtil.getSession().update(user);
HibernateUtil.commit();
}



//HibernateUtil类:
package util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
private static SessionFactory sf;
private static Transaction ts;
private static Session session;
static {
sf = new Configuration().configure().buildSessionFactory();
}

public static Session getSession() {
session = sf.getCurrentSession();
ts = session.beginTransaction();
return session;
}

public static void commit() {
try {
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
...全文
30820 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaoming_xinshou 2010-09-07
  • 打赏
  • 举报
回复
19楼讲得对
yanyanforest 2010-06-18
  • 打赏
  • 举报
回复
既然是更新,那你总得从页面获取id 然后用findbyid(..)获取出一个实体对象,再进行update不就ok了!我也遇到的是类似的错误!呵呵
plj 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 panhaichun 的回复:]
引用 10 楼 long5000 的回复:


我将程序改成如下,但同样的问题还是存在,郁闷啊。
//-------------------------
public class HibernateUtil {
private static SessionFactory sf;

//private static Transaction ts;
private static Se……
[/Quote]

.getHibernateTemplate().flush();
dangelrose 2009-11-25
  • 打赏
  • 举报
回复
!!!
Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1


写的很清楚哈~~
我猜测原因:

你要更新他 expected: 1 期望更新一个。。
但是现在 0 actual row count: 0

所以更新失败。

你确定你的更新函数是对的??

我之前要更新的话必定要先 加载一个class 。。

1-session.load(**.class,objectID)...
2-然后update()。
3-再commit()
!!!

你没有对hibernate的机制了解到位

先了解下他的更新的机制 再做也不迟。。
panhaichun 2009-11-25
  • 打赏
  • 举报
回复
public void update(User user) {
session = HibernateUtil.getSession();
session.update(user);
HibernateUtil.commit(session);
}

重新瞄了下异常,楼主的问题是否与多线程无关,user 对象是不是主键在数据库中不存在哦,或者ID为null
long5000 2009-11-25
  • 打赏
  • 举报
回复
问题解决了,更新的对象不是persistent对象。要获得持久态对象有多种方法:
(1)用session的get(Class clazz, Serializable id)方法
(2)用session的load(Class clazz, Serializable id)方法;
总结:还是对Hibernate的基本结构,基本原理不熟啊,继续看书,呵呵,谢谢大家!
libinsoft 2009-11-24
  • 打赏
  • 举报
回复
session.flush()
long5000 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 panhaichun 的回复:]
引用 10 楼 long5000 的回复:


我将程序改成如下,但同样的问题还是存在,郁闷啊。
//-------------------------
public class HibernateUtil {
private static SessionFactory sf;

//private static Transaction ts;
private static Session session;
static {
sf = new Configuration().configure().buildSessionFactory();
}

public static Session getSession() {
session = sf.getCurrentSession();
session.beginTransaction();
return session;
}

public static void commit(Session session) {
try {
session.getTransaction().commit();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

//-----------------
public void update(User user) {
HibernateUtil.getSession().update(user);
HibernateUtil.commit(HibernateUtil.getSession());
}



这样仍然存在线程问题。。。。这个变量:private static Session session;
[/Quote]

如果不添加这个变量,那么这个session去哪弄啊?
panhaichun 2009-11-24
  • 打赏
  • 举报
回复
楼主就是因为线程问题引起的,HibernateUtil改成这样
public class HibernateUtil {
private static SessionFactory sf;

static {
sf = new Configuration().configure().buildSessionFactory();
}

public static Session getSession() {
session = sf.getCurrentSession();
session.beginTransaction();
return session;
}

public static void commit(Session session) {
try {
session.getTransaction.commit();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
long5000 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 foxriver1205 的回复:]
没设置更新条件,直接update(user)肯定报异常。。
[/Quote]
你是说需要给update加条件吗?这个怎么加啊?能举个例子吗?谢谢
hibernate 中insert方法可以直接使用啊,update方法不可以吗?
long5000 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 licip 的回复:]
你用MyEclipse开发工具去加入hibernate支持,它会帮你生存一个线程安全的HibernateSessionFactory你去看看就会明白的。
[/Quote]
thank you!
long5000 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyangxiaokang6 的回复:]
没有检索出结果来吧。仔细检查一下你的检索条件!
[/Quote]
从数据库中能查出来对象,但更新对象属性后,再update的时候就有问题了,出现一堆异常。
foxriver1205 2009-11-24
  • 打赏
  • 举报
回复
没设置更新条件,直接update(user)肯定报异常。。
licip 2009-11-24
  • 打赏
  • 举报
回复
你用MyEclipse开发工具去加入hibernate支持,它会帮你生存一个线程安全的HibernateSessionFactory你去看看就会明白的。
panhaichun 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 long5000 的回复:]


我将程序改成如下,但同样的问题还是存在,郁闷啊。
//-------------------------
public class HibernateUtil {
private static SessionFactory sf;

//private static Transaction ts;
private static Session session;
static {
sf = new Configuration().configure().buildSessionFactory();
}

public static Session getSession() {
session = sf.getCurrentSession();
session.beginTransaction();
return session;
}

public static void commit(Session session) {
try {
session.getTransaction().commit();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

//-----------------
public void update(User user) {
HibernateUtil.getSession().update(user);
HibernateUtil.commit(HibernateUtil.getSession());
}

[/Quote]

这样仍然存在线程问题。。。。这个变量:private static Session session;
long5000 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 panhaichun 的回复:]
楼主这个HibernateUtil存在严重线程问题
[/Quote]

能详细点吗?这个问题真是头疼,我初次使用Hibernate,不知道是哪的问题啊?谢谢
fenglincao51288 2009-11-24
  • 打赏
  • 举报
回复
你的缓存没有清空,session.flush()
long5000 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 panhaichun 的回复:]
楼主就是因为线程问题引起的,HibernateUtil改成这样
public class HibernateUtil {
private static SessionFactory sf;

static {
sf = new Configuration().configure().buildSessionFactory();
}

public static Session getSession() {
session = sf.getCurrentSession();
session.beginTransaction();
return session;
}

public static void commit(Session session) {
try {
session.getTransaction.commit();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

[/Quote]

我将程序改成如下,但同样的问题还是存在,郁闷啊。
//-------------------------
public class HibernateUtil {
private static SessionFactory sf;

//private static Transaction ts;
private static Session session;
static {
sf = new Configuration().configure().buildSessionFactory();
}

public static Session getSession() {
session = sf.getCurrentSession();
session.beginTransaction();
return session;
}

public static void commit(Session session) {
try {
session.getTransaction().commit();
session.close();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

//-----------------
public void update(User user) {
HibernateUtil.getSession().update(user);
HibernateUtil.commit(HibernateUtil.getSession());
}
panhaichun 2009-11-23
  • 打赏
  • 举报
回复
楼主这个HibernateUtil存在严重线程问题
ouyangxiaokang6 2009-11-23
  • 打赏
  • 举报
回复
没有检索出结果来吧。仔细检查一下你的检索条件!

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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