配置使用Hibernate遇到的异常:org.hibernate.StaleStateException: Unexpected row count: 0 expected: 1

来源:互联网 发布:cnc编程多少钱一月2017 编辑:程序博客网 时间:2024/05/22 14:09
在学习hibernate的配置与使用的过程时,尤其在利用关联关系操纵对象时常常会遇到这样的异常:
org.hibernate.StaleStateException: Unexpected row count: 0 expected: 1
下面我贴出自己再配置使用过程中遇到的问题供大家参考!!

我使用的映射文件有Student.hbm.xml和Card.hbm.xml
下面列出代码清单:
-------Student.hbm.xml------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.corebean.Student" table="Student" lazy="true">
        <id name="id">
            <generator class="increment"></generator></id>
        <property name="name" column="NAME" type="string"></property>
        <property name="card_id" column="CARD_ID" type="int"></property>
        <property name="sex" column="SEX" type="string"></property>
        <property name="age" column="AGE" type="int"></property>
        <one-to-one name="card" class="com.corebean.Card" fetch="join" cascade="all"></one-to-one>
    </class>
</hibernate-mapping>

--------Card.hbm.xml------
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
    <class name="com.corebean.Card" table="Card" lazy="true">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="name" column="NAME" type="string">
        </property>
        <many-to-one name="stu" class="com.corebean.Student"
            column="STU_ID" unique="true">
        </many-to-one>
    </class>
</hibernate-mapping>

测试所用的代码是:
------OneToOne.java-------------
public class OneToOneTest {

    public static void main(String[] args) {
       
        //新建Student对象
        Student stu=new Student();
        stu.setName("allen");
        stu.setCard_id(102);
        stu.setSex("male");
        stu.setAge(25);
        //新建Card对象
        Card card=new Card();
        card.setName("allen");
        card.setStu_id(1);
       
        //设置Student对象与Card对象 之间的关联
        stu.setCard(card);
        card.setStu(stu);//此句不能省略,否则card将不知从何处取得主键值
       
        //从HibernateUtil类获得一个Session实例
        Session session=HibernateUtil.currentSession();
        //获得一个Transaction 实例
        Transaction tx=session.beginTransaction();
        try{
            //保存stu对象,由于stu对card对象的级联是cascade="all",故也将级联保存在card对象
            session.save(stu);
            //session.save(card);
            tx.commit();
           
            session.close();//最后释放session,放在前面会出错
           
        }catch(HibernateException e){
            e.printStackTrace();
            tx.rollback();
        }
    }

}

在运行时出现了这样的异常:(通过设置sql-show属性为true显示sql语句在调试时真是很有用!!)

Hibernate: select max(id) from Student
Hibernate: insert into Student (NAME, CARD_ID, SEX, AGE, id) values (?, ?, ?, ?, ?)
Hibernate: update Card set NAME=?, STU_ID=? where id=?
org.hibernate.StaleStateException: Unexpected row count: 0 expected: 1
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:27)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2204)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:91)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at com.OneToOne.OneToOneTest.main(OneToOneTest.java:41)

看上面的异常信息有一条:Unexpected row count: 0 expected: 1
你正在调用saveOrUpdate往主键里添值,当主键被设置时saveOrUpdate产生了Update而不是insert
即Hibernate: update Card set NAME=?, STU_ID=? where id=?
由于Card表格里主键id没有值所以产生了错误!!
因而只需要使关联操纵时不是用Update就解决了问题!!


最后我是将<one-to-one>属性cascade的值改为none后,解决了问题!!


 
原创粉丝点击