2010-08-01 48 views
0

Je suis nouveau à hiberner. J'ai une transaction qui échoue avec une exception HibernateException, mais la table est modifiée après la validation. Voici le code:(hibernate) table modifiée après l'échec de la validation

public StoreResult store(Entry entry) 
{ 
    Session session = HibernateUtility.getSessionFactory().openSession(); 
    Transaction transaction = session.beginTransaction(); 

    try 
    {   
     String id; 

     if (entry.getStatus() == Entry.Status.PUBLISHED) 
     { 
      id = TitleToURLConverter.convert(entry.getTitle()); 
     } 
     else 
     { 
      id = "temp_"; 
     } 

     if (entry.getId() == null) 
     { 
      entry.setId(id); 
      session.save(entry); 
     } 
     else 
     { 
      session.update(entry); 

      session.createQuery("update Entry set id = :newId where id = :oldId") 
      .setString("newId", id) 
      .setString("oldId", entry.getId()) 
      .executeUpdate(); 

      session.refresh(entry); 
     } 

     transaction.commit(); 

     return StoreResult.SUCCESS; 
    } 
    catch (RuntimeException e) 
    { 
     transaction.rollback(); 
     if (e instanceof ConstraintViolationException) return StoreResult.DUPLICATE_ID; 

     throw e; 
    } 
    finally 
    { 
     session.close(); 
    } 
} 

EDIT: Apparemment, InnoDB ne pas la transaction rollback sur clé doublon mais seulement la déclaration. Je voudrais que la transaction soit toujours annulée sur TOUTE erreur.

EDIT2: Ne tenez pas compte de cela. J'utilisais MyIsam.

+0

Quels sont les détails de l'exception que vous obtenez? –

+0

Il s'agit d'une exception ConstraintViolationException à cause d'un ID dupliqué dans la table. Cela signifie qu'une entrée avec le même identifiant existe. Je veux le manipuler et afficher un tel message à l'utilisateur. Merci pour votre réponse! transaction.wasCommited() renvoie la valeur false. –

+0

Maintenant que vous l'avez fonctionné, pensez à mettre la création de session et d'instance de transaction en utilisant des instructions pour disposer correctement. –

Répondre

1

Le passage de MyIsam à InnoDB a corrigé ce problème.