简体   繁体   中英

Why org.hibernate.TransactionException in Hibernate and avoid

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:

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM