为什么在Hibernate中使用org.hibernate.TransactionException并避免

我是Hibernate的新手。

我试图编写一个小程序来将数据插入到mysql数据库服务器中。

这是我的程序的源代码:

private int insertRelateNew(int newId, List 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。

这是exception控制台:

 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()。

但这种方式可能会丢失我想要插入数据库的记录。

我想找到为什么exception会发生以避免它。

我在Hibernate Java Doc中搜索了Exception: http : //www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/TransactionException.html

它说:“表示交易无法开始,提交或回滚。”

它没有解释exception发生的原因。

请解释为什么exception发生以及如何避免它。

非常感谢。

解释很简单:只启动一次事务,但多次提交:

 Transaction tx = session.beginTransaction(); ... for (DocSimilar doc : relateNews) { ... tx.commit(); } 

您要为每个文档分配一个单独的事务,并且事务必须在for循环内部开始,或者您希望所有文档都有一个事务,并且提交必须在for循环之外。

我有与您相同的错误消息,我发现即使回滚也可能在这里给您带来问题。

在我的情况下,当我调用“ tx.rollback() ”时,它会抛出错误“org.hibernate.TransactionException:Transaction not successfully started”。

所以当我意识到这一点时,我添加了以下……

 if (tx!=null && tx.isActive()) { tx.rollback(); } 

然后它揭示了另一个exception,现在更好了,现在我可以看到真正的问题在哪里,这是我插入的一些标准我没有实现…

希望这会有所帮助,欢呼。