2012-06-06 26 views
5

私はHibernateの初心者です。なぜorg.hibernate.TransactionExceptionがHibernateで避けられるか

私はmysqlデータベースサーバーにデータを挿入するための小さなプログラムをコーディングしようとしました。

これは私のプログラムのソースコードです:

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; 
} 

実行している場合、それは成功した挿入が、いつかそれはTransactionExceptionを投げます。

これは例外のコンソールです:

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) 

私は問題を検索、誰かが)例外とロールバックを(キャッチ助言しました。

しかし、この方法ではDBに挿入したいレコードが失われる可能性があります。

私は例外がなぜそれを避けるために起こるのかを知りたい。

私は、HibernateのJavaドキュメントで例外を検索:http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/TransactionException.html

それは言った:「トランザクションは、開始、コミットまたはロールバックすることができなかったことを示しています。」

例外が発生する理由は説明しません。

例外が発生する理由と回避方法を教えてください。

ありがとうございました。

+0

ロギングAPIは使用していますか? 'org.hibernate.transaction'ロガーを有効にし、分析のためにログを取得します。 –

答えて

4

説明は単純です:あなたは一度だけ取引を開始し、それを複数回コミット:あなたは、各ドキュメントのために別々の取引をしたい、との取引がためのループ内で開始する必要がありますどちらか

Transaction tx = session.beginTransaction(); 
... 
for (DocSimilar doc : relateNews) { 
    ... 
    tx.commit(); 
} 

を、またはすべてのドキュメントに対して1つのトランザクションが必要であり、コミットはforループの外側になければなりません。

+2

JB Nizetとまったく同じです。どうもありがとう。私はただそれを修正しました。 – tienthanhakay

2

あなたと同じエラーメッセージが表示されていましたが、ロールバックしても問題が発生することがわかりました。

私の場合、「tx.rollback()」と呼ぶと、「org.hibernate.TransactionException:Transaction not successfully started」というエラーが表示されます。

だから私は、私は、次の追加、気づいたときに...

if (tx!=null && tx.isActive()) { 
tx.rollback(); 
} 

が、それは今で優れている別の例外は、本当の問題は、それが中にいくつかの基準ですが、あるのWHERE今私が見ることができる原因と私を明らかに私のインサート私は実現していない...

これは、歓声を助けることを願っています。

関連する問題