在学习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后,解决了问题!!
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后,解决了问题!!