首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在Hibernate中使用org.hibernate.TransactionException并避免

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

Stack Overflow用户
提问于 2012-06-06 15:21:37
回答 2查看 9.4K关注 0票数 5

我是冬眠新手。

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

这是我的程序的源代码:

代码语言:javascript
运行
复制
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。

这是异常控制台:

代码语言:javascript
运行
复制
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

它说:“表示事务无法开始、提交或回滚。”

它不能解释为什么会发生异常。

请为我解释为什么会发生异常,以及如何避免它。

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-06 15:34:48

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

代码语言:javascript
运行
复制
Transaction tx = session.beginTransaction();
...
for (DocSimilar doc : relateNews) {
    ...
    tx.commit();
}

要么希望为每个文档使用单独的事务,并且事务必须在for循环内开始;要么希望为所有文档使用单个事务,并且提交必须在for循环之外。

票数 6
EN

Stack Overflow用户

发布于 2014-02-13 06:52:53

我有和你一样的错误信息,我发现即使是回滚也会给你带来问题。

在我的例子中,当我调用"tx.rollback()“时,它抛出了错误"org.hibernate.TransactionException: Transaction not successfully”。

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

代码语言:javascript
运行
复制
if (tx!=null && tx.isActive()) {
 tx.rollback();
}

然后它向我揭示了另一个例外,现在好多了,因为我现在可以看到真正的问题在哪里,这是我在插入中没有满足的一些标准……

希望这能帮上忙,干杯。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10909827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档