我是Hibernate的新手.
我试图编写一个小程序来将数据插入到mysql数据库服务器中.
这是我的程序的源代码:
private int insertRelateNew(int newId, List<DocSimilar> relateNews) {
    Session session = HibernateUtils.currentSession();
    Transaction tx = session.beginTransaction();
    RelatedArticles relatedArticles = null;
    try {
        relatedArticles = new RelatedArticles();
        for (DocSimilar doc : relateNews) {
            ApplicationPK appPK = new ApplicationPK(newId,
                    (int) doc.getDocid());
            relatedArticles.setApplicationPK(appPK);
            relatedArticles.setRelated_score(doc.getPercent());
            session.save(relatedArticles);
            tx.commit();
            session.flush();
        }
    } catch (Exception e) {
        e.printStackTrace();
        tx.rollback();
    }
    return newId;
}
运行时,它插入成功但有时它抛出一个TransactionException.
这是异常控制台:
org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:131)
    at com.ant.crawler.dao.hibernate.SqlNewsPersistencer.insertRelateNew(SqlNewsPersistencer.java:56)
    at com.ant.crawler.dao.hibernate.SqlNewsPersistencer.insertNews(SqlNewsPersistencer.java:40)
    at com.ant.crawler.dao.hibernate.SqlPersistencer.store(SqlPersistencer.java:44)
    at com.ant.crawler.core.AbstractCrawler.crawl(AbstractCrawler.java:186)
    at com.ant.crawler.core.Worker.run(Worker.java:14)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
我搜索了这个问题,有人建议抓住Exception和rollback().
但这种方式可能会丢失我想要插入数据库的记录.
我想找到为什么异常会发生以避免它.
我在Hibernate Java Doc中搜索了Exception:http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/TransactionException.html
它说:"表示交易无法开始,提交或回滚."
它没有解释异常发生的原因.
请解释为什么异常发生以及如何避免它.
非常感谢.
解释很简单:您只启动一次事务,但多次提交:
Transaction tx = session.beginTransaction();
...
for (DocSimilar doc : relateNews) {
    ...
    tx.commit();
}
要么您希望每个文档都有一个单独的事务,并且该事务必须在 for 循环内开始,要么您希望所有文档都有一个事务,并且提交必须在 for 循环之外。
| 归档时间: | 
 | 
| 查看次数: | 7949 次 | 
| 最近记录: |