2012-06-06 17 views
5

Soy novato en Hibernate.Por qué org.hibernate.TransactionException en Hibernate y evitar

He intentado codificar un pequeño programa para insertar datos en el servidor de la base de datos mysql.

Este es el código fuente de mi programa:

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

Cuando se ejecuta, se inserte un éxito, pero en algún Se lanza un TransactionException.

Esta es la consola Excepción:

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) 

busqué el problema, alguien aconsejó detectar la excepción y rollback().

Pero de esta manera puede perder el registro que quiero insertar en la base de datos.

Quiero encontrar por qué ocurre la excepción para evitarlo.

He buscado en la Excepción en Hibernate Java Doc: http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/TransactionException.html

Se dijo: "Indica que una transacción no se podría iniciar, confirmar o retrotraer".

No explica por qué ocurre la excepción.

Por favor, explíqueme por qué ocurre la excepción y cómo evitarla.

Muchas gracias.

+0

¿Utiliza alguna API de registro? Habilite los registradores 'org.hibernate.transaction' y obtenga el registro para el análisis. –

Respuesta

4

La explicación es simple: se inicia una transacción sólo una vez, sino de comprometerse varias veces:

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

Cualquiera que desee una transacción separada para cada documento, y la transacción debe comenzar dentro del bucle, o desea una sola transacción para todos los documentos, y la confirmación debe estar fuera del ciclo for.

+2

JB Nizet Exactamente. Muchas gracias. Lo acabo de arreglar. – tienthanhakay

2

Tuve el mismo mensaje de error que el suyo, encontré que incluso la reversión podría darle un problema aquí.

En mi caso, cuando llamo "tx.rollback()", me arroja el error "org.hibernate.TransactionException: La transacción no se inició correctamente".

Por eso, cuando me di cuenta de eso, añade lo siguiente ...

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

entonces me revela otra excepción, que es mejor ahora, causó ahora puedo ver dónde está el problema real es que es algunos criterios mi inserción no he cumplido ...

Espero que esto ayude, saludos.

Cuestiones relacionadas