gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:13 26 4
gpt4 key购买 nike

我是 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)

我搜索了这个问题,有人建议捕获异常并回滚()。

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

我想找出异常发生的原因以避免它。

我在 Hibernate Java Doc 中搜索了异常: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 循环之外。

关于java - 为什么在 Hibernate 中使用 org.hibernate.TransactionException 并避免,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10909827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com