我的項目使用hibernate與spring事務管理器和我的數據庫是postgres(可能無關緊要)。處理數據庫約束hibernate
我正在嘗試讀取大的XML文件,並構造出那些對象(對象不是很大,但金額是),並將它們插入到數據庫中。
如果有機會,我的某個對象違反了數據庫約束,整個過程就會停止。我怎樣才能跳過那些違反數據庫約束的?或者將他們的ID或其他日誌記錄到日誌文件中?
問題更新:
我一直很瀏覽槽和發現,對於批量插入它的最好建議使用無狀態會話,但我仍然得到同樣的問題,插入停止:
May 26, 2012 4:45:47 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "UN_FK"
Detail: Key (fid)=(H1) already exists.
下面是我的代碼的相關部分,用於解析xml並插入到db中,爲了簡單起見,我們假設我正在插入電影:
//class field
@Autowired
private SessionFactory sessionFactory;
@Override
public void startDocument() throws SAXException {
session = sessionFactory.getCurrentSession();
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("FILM")) {
movie.setCategory(category);
movie.setAdded(new Date());
session.insert(movie);
}
}
我將這個屬性設置爲app-ctx hibernate.jdbc.batch_size
爲100.爲了避免這種情況,在插入之前確實需要做select?
更新2:
如果我使用StatelessSession
而不是會議上,我得到20個以防萬一刀片和比無限期地處理停止無任何異常或任何東西。
我認爲數字20是因爲我與tomcat共享連接並且有maxActive="20"
。
賞金更新:
我真的很想看到有人提供的解決方案(不選擇防守如果可能的話)。使用無狀態會話或只是會話。
一個簡單的try catch語句不會做。一旦Hibernate拋出異常,會話狀態就不一致,必須回滾事務,並關閉會話。而且,只有在錯誤記錄持續存在很久之後,異常纔會在刷新時被拋出。 –
這就是爲什麼建議在這種情況下使用無狀態Hibernate會話的原因。它可以防止不連貫的狀態,並減少內存消耗(或者不必驅逐已處理的實體) –