I’m newbie in Hibernate.
I have tried to code a small program to insert data into mysql database server.
This is source code of my program:
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;
}
When running, It insert successful but sometime It throw a TransactionException.
This is Exception console:
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)
I searched the problem, somebody advised catch the Exception and rollback().
But this way can lose the record that I want insert into DB.
I want find why the Exception is happen to avoid It.
I searched the Exception in Hibernate Java Doc: http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/TransactionException.html
It said: “Indicates that a transaction could not be begun, committed or rolled back.”
It doesn’t explain why the Exception happen.
Please explain for me why the exception happen and how avoid It.
Thanks very much.
The explanation is simple: you start a transaction only once, but commit it several times:
Either you want a seperate transaction for each doc, and the transaction must begin inside the for loop, or you want a single transaction for all the docs, and the commit must be outside the for loop.