Gan*_*row 7 java hibernate transactions batch-processing spring-transactions
我的项目是使用带有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.
Run Code Online (Sandbox Code Playgroud)
以下是我的代码解析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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在app-ctx中将此属性设置hibernate.jdbc.batch_size为100.为了避免这种情况,是否真的有必要在插入之前进行选择?
更新2:
如果我使用StatelessSession而不是会话,我会获得20次插入,而且处理无限期地停止,没有任何异常或任何东西.
我假设数字20是因为我正在与tomcat建立连接并且拥有maxActive="20".
赏金更新:
我真的很想看到有人提供解决方案(如果可能的话,没有防守选择).使用statelessSession或仅使用会话.
大多数类型的约束,例如列是否可以为空或具有最大宽度,您可以使用Hibernate Validator进行检查进行检查。只需在尝试持久化对象之前手动执行该对象的验证即可。
对于某些事情,特别是唯一的约束,您需要执行“防御”选择以查看是否存在冲突,或者维护内存中已插入的一组值。