我的项目使用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会话的原因。它可以防止不连贯的状态,并减少内存消耗(或者不必驱逐已处理的实体) –