1
我是Hibernate的新手。 現在正在從web上的例子。 我有一個MySQL數據庫,其中包含一些表,包括表「專業」。此表有兩個列:profession_id(自動增量)和profession_name。Java。休眠。 org.hibernate.StaleStateException:批量更新從update [0]返回意外的行數;實際行數:0;預期:1
在java項目中我有一個'測試'類,它包含幾個表處理方法和'main'方法。 加工方法:
private void addProfession(String name) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Profession r = new Profession();
r.setProfessionName(name);
session.save(r);
session.getTransaction().commit();
}
private ArrayList<Profession> getProfessions() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
ArrayList<Profession> result = (ArrayList<Profession>) session
.createQuery("from Profession order by professionName").list();
session.getTransaction().commit();
return result;
}
private void deleteProfessions(ArrayList<Profession> result) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
for (Profession p : result) {
System.out.println("Delete: " + p.getProfessionId() + ": " + p.getProfessionName());
session.delete(p);
}
session.getTransaction().commit();
}
private void deleteEntity(Object object){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.delete(object);
session.flush();
session.getTransaction().commit();
}
'主' 方法包含以下操作:
public static void main(String[] args) {
Test test = new Test();
test.addProfession("Profession_1");
test.addProfession("Profession_2");
test.addProfession("Profession_3");
test.addProfession("Profession_4");
test.addProfession("Profession_5");
ArrayList<Profession> result = test.getProfessions();
test.deleteEntity(result.get(0));
test.deleteProfessions(result);
}
所以,問題是:當我運行它,我得到
Exception in thread "main" org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:67)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:54)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3197)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3434)
at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:98)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
at firstproject.Main.deleteProfessions(Main.java:33)
at firstproject.Main.main(Main.java:57)
閱讀幾個主題之後關於這個主題在stackoverflow我瞭解到,這個問題以某種方式與ID連接。所以我決定評論這段代碼:
test.deleteEntity(result.get(0));
之後,一切正常。
所以問題是: 我如何避免這種異常,如果我需要: 1.刪除其中一行('因爲這個問題也會發生,當我刪除例如result.get(3)等等) 。 2.刪除剩餘的行。
恥辱我:)! 非常感謝。 Upd:在test.deleteEntity(result.get(0))後加上這個 'result = test.getProfessions();'更新結果列表的第二種方式(我沒有注意到)。 ' – Kleeo