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.
Quels sont les détails de l'exception que vous obtenez? –
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. –
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. –