为什么在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,现在更好了,现在我可以看到真正的问题在哪里,这是我插入的一些标准我没有实现…
希望这会有所帮助,欢呼。
- Hibernate获取具有多个关联
- 带有Hibernate 4和ManyToOne级联的IllegalStateException
- 我怎么能用Hibernate的“无法解析配置”错误?
- JPA(Hibernate)和自定义表前缀
- 如何使用querydsl调用mysql函数?
- 为什么在从jndi.properties注入后在JNDI中找不到数据源?
- 如何将@UniqueConstraint与单表inheritance(JPA)一起使用?
- org.hibernate.internal.util.config.ConfigurationException:找不到cfg.xml资源
- 提高了PostgreSQL查询性能,并且已经连接了1亿个数据