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.
SQLGrammarException. SQLGrammarException indicates that the SQL sent to the database was invalid. It could be due to a syntax error or an invalid object reference.
Not all transaction managers support nested transactions. Spring supports this out of the box only with the JDBC DataSourceTransactionManager, which is what we'll cover.
The explanation is simple: you start a transaction only once, but commit it several times:
Transaction tx = session.beginTransaction();
...
for (DocSimilar doc : relateNews) {
...
tx.commit();
}
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.
I had the same error message as yours, I found that even the rollback could give you a problem here.
In my case, when I call "tx.rollback()
", it throws me above error "org.hibernate.TransactionException: Transaction not successfully started".
So when I realized that, I added following ...
if (tx!=null && tx.isActive()) {
tx.rollback();
}
then it reveals me another exception, which is better now, caused now I can see where's the real problem is, it's some criteria in my insert I've not fulfilling ...
Hope this helps, cheers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With