2014-01-14 67 views
19

我寫下這個方法是假設從數據庫中刪除成員記錄。但是當我在我的servlet中使用它時,它會返回一個錯誤。休眠刪除錯誤:批量更新返回意外的行計數

MemberDao類

public static void deleteMember(Member member) { 
    Session hibernateSession = HibernateUtil.getSessionFactory().getCurrentSession(); 
    Transaction tx = hibernateSession.beginTransaction(); 
    hibernateSession.delete(member); 
    tx.commit(); 
} 

控制器部

if(delete != null) { 
    HttpSession httpSession = request.getSession(); 
    Member member = (Member) httpSession.getAttribute("member"); 

    MemberDao.deleteMember(member); 

    nextPage = "ledenlijst.jsp"; 
} 

HTTP狀態500

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

遜當我嘗試多次執行頁面時,它甚至會拋出這個錯誤。

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update 

有沒有人知道究竟是什麼導致了這些錯誤?

+0

可能的重複:http://stackoverflow.com/questions/3853106/org-hibernate-stalestateexception-batch-update-returned-unexpected-row-count-fr –

+0

你是否試圖刪除同一個'member'兩次? –

回答

42

錯誤可能是由幾件事引起的。我沒有拿它的功勞,發現它here

  1. Flushing the data before committing the object may lead to clear all object pending for persist.
  2. If object has primary key which is auto generated and you are forcing an assigned key
  3. if you are cleaning the object before committing the object to database.
  4. Zero or Incorrect ID: If you set the ID to zero or something else, Hibernate will try to update instead of insert.
  5. Object is Stale: Hibernate caches objects from the session. If the object was modified, and Hibernate doesn’t know about it, it will throw this exception — note the StaleStateException

也期待在this answerbeny23這給一些提示,進一步查找問題。

  • In your hibernate configuration, set hibernate.show_sql to true. This should show you the SQL that is executed and causes the problem.
  • Set the log levels for Spring and Hibernate to DEBUG, again this will give you a better idea as to which line causes the problem.
  • Create a unit test which replicates the problem without configuring a transaction manager in Spring. This should give you a better idea of the offending line of code.
+2

對象是陳舊的:Hibernate從會話中緩存對象。如果對象被修改,並且Hibernate不知道它,它會拋出這個異常 - 注意StaleStateException –

0

我面臨同樣的問題。代碼在測試環境中工作。但它在分段環境中不起作用。

org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update [0]; actual row count: 3; expected: 1 

問題是表中有測試數據庫表中每個主鍵的單個條目。但是在分段DB中,對於相同的主鍵有多個條目。 (問題是暫存數據庫表中沒有任何主鍵約束還有多個條目。)

因此,每次更新操作時都會失敗。它試圖更新單個記錄,並期望將更新計數設置爲1.但是由於表中存在相同主鍵的3條記錄,因此結果更新計數爲3.由於預期更新計數和實際結果更新計數不匹配它拋出異常並回滾。

之後,我刪除了所有具有重複主鍵和添加主鍵約束的記錄。它工作正常。

0

這是我的情況的解決方案,也許它會幫助你!

實際上,它是一個數據庫字段類型(postgreSQL上的時間戳)和他在hibernate xml文件上的等效屬性類型(日曆)之間的轉換問題。 當Hibernate執行此更新請求時,它沒有檢索該行,因爲該請求使用錯誤的轉換日曆值進行查詢。 所以我簡單地在Hibernate xml文件的「Date」中替換了屬性類型「Calendar」,並且問題得到了解決。

0

我最近經歷過這個,發生了什麼事情是我使用了更新方法,並且因爲沒有現有記錄而引發異常。我將該方法更改爲saveOrUpdate。有效。

0

當使用memcached作爲二級緩存時,我遇到了與hibernate/JPA 2.1相同的問題。你會得到上面的異常以及一個StaleStateException。該決議與之前提到的不同。

我注意到,如果你有一個交叉操作,刪除和選擇(發現)從同一個表和事務,hibernate可能會變得不堪重負,並報告該陳舊的狀態異常。它只會在生產過程中發生,因爲在同一張桌子上會出現不同實體上的多個相同操作。你會看到系統超時並拋出異常。

解決方案是簡單地更高效。而不是在一個循環中交錯,試圖解決哪些項目需要閱讀和這樣做,最好在一個操作。然後在單獨的操作中執行刪除。同樣,所有在同一個事務中,但不要用讀/刪除/讀/刪除操作胡鬧休眠。

這要快得多,並且大大減少了Hibernate的內務負載。問題消失了。當您使用輔助緩存時會發生這種情況,否則不會發生,因爲負載將在數據庫上進行解析而無需輔助緩存。這是另一個問題。

1

在我的情況下,這個異常是由錯誤的實體映射引起的。關係沒有級聯,並且在嘗試從父級引用它之前,引用的子實體未保存。更改爲

@OneToMany(cascade = CascadeType.ALL) 

修復了這個問題。

確實找到這個異常的原因的最好方法是設置日誌的show_sql和DEBUG級別 - 它只會停止在導致問題的sql。

0

我有這個問題,

我檢查了我的代碼,沒有發現任何問題,但是當我檢查我的數據,我發現,我有兩個實體使用相同的ID!

因此,flush()無法正常工作,因爲它對批量更新一個接一個地工作,並且找到2行。因此,它沒有更新和拋出異常,但這是我的問題。我不知道它是否適合你的工作!

0

例外 org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 使用時,該實體他要​​刷新到數據庫Hibernate的通知是不完全的,因爲它是在事務開始時拋出。

我更詳細地描述了兩種不同的使用情況,發生在我身上here

相關問題