我的项目正在使用带有spring事务管理器的hibernate,我的数据库是postgres(可能无关紧要)。
我正在尝试读取大的 xml 文件并从中构造对象(对象不大,但数量很大)并将它们插入数据库。
如果碰巧我的一个对象违反了数据库约束,整个过程就会停止。如何跳过违反数据库约束的那些?或者将他们的 id 或其他任何内容记录到日志文件中?
问题更新:
我一直在浏览 SO,发现对于批量插入,最好建议使用无状态会话,但我仍然遇到同样的问题并且插入停止:
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 并插入数据库的代码的相关部分,为简单起见,假设我正在插入电影:
//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。为了避免这种情况,是否真的有必要在插入之前进行选择?
更新 2:
如果我使用StatelessSession
而不是会话,我会得到大约 20 次插入,然后处理会无限期地停止,没有任何异常或任何东西。
我假设数字 20 是因为我正在与 tomcat 合并连接并拥有maxActive="20"
.
赏金更新:
我真的很想看到有人提供解决方案(如果可能,没有防御选择)。使用 statelessSession 或只是会话。