Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why org.hibernate.TransactionException in Hibernate and avoid

Tags:

java

hibernate

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.

like image 761
tienthanhakay Avatar asked Jun 06 '12 07:06

tienthanhakay


People also ask

What is org Hibernate exception SQLGrammarException?

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.

Is nested transactions are not supported by spring?

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.


2 Answers

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.

like image 79
JB Nizet Avatar answered Sep 30 '22 08:09

JB Nizet


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.

like image 28
user816101 Avatar answered Sep 30 '22 07:09

user816101