Hibernate transaction qui n'est pas démarré avec succès
Considérer cette simple Hibernate scénario:
session = getHibernateSession();
tx = session.beginTransaction();
SomeObject o = (SomeObject) session.get(SomeObject.class, objectId);
tx.commit();
Ce code génère l'exception suivante:
org.hibernate.TransactionException: Transaction not successfully started
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:100)
at com.bigco.package.Clazz.getSomeData(Clazz.java:1234)
Ce qu'il se passe?
- Êtes-vous également à l'aide d'un gestionnaire de transactions?
- Je ne suis pas exactement sûr de ce que la configuration de l'est, mais en supposant que nous disposons d'un gestionnaire de transactions, cela affecte dit comportement?
- J'ai lu que parfois la création manuelle d'une transaction comme vous avec un gestionnaire de transactions présent va l'amener à lever cette exception.
- C'est vraiment une bonne question et dur à croire réponse. Pourquoi serait Hibernate validation de la transaction lorsqu'une entité est récupérée via get(...)? Je n'ai pas été en mesure de traquer les réponses à cette Hb documents encore. Est-ce parce que le reçois vérifie la transaction sous-jacente, puis l'utilise pour faire le SÉLECTIONNER, puis l'engage? J'aimerais voir beaucoup plus de réponse détaillée à cette question.
Vous devez vous connecter pour publier un commentaire.
Bien, il semble que une fois que nous atteignons l'
tx.commit()
ligne, la transaction a déjà été commis. Ma conjecture est que Hibernate déjà valide la transaction lorsqueget()
ing de l'objet.Le correctif pour cela est simple:
C'est une très vieille question, et je suppose que vous avez déjà résolu (ou renoncé à la mise en veille prolongée), mais la réponse est tragiquement simple. Je suis surpris que personne d'autre l'ont ramassé.
Vous n'avez pas fait une session.enregistrer(o), donc il n'y a rien dans la transaction de s'engager. La validation peut ne pas fonctionner si vous n'avez pas changé quoi que ce soit dans l'objet, mais pourquoi voulez-vous enregistrer si rien n'a changé?
BTW: Il est également tout à fait acceptable de faire la session.obtenir(...) avant la session.beginTransaction().
J'ai appris à connaître que ce qui est déjà résolu, même si je suis de poster ma réponse ici.
Je n'ai pas trouvé
wasCommitted()
méthode sur la transaction.Mais le code suivant fonctionné pour moi:
Une situation cela peut se produire dans est lorsque le code est dans un EJB/MDB à l'aide de container-managed transactions (CMT), intentionnellement ou non, parce que c'est la valeur par défaut. Pour utiliser bean-managed transactions, ajouter l'annotation suivante:
@TransactionManagement(TransactionManagementType.BEAN)
Il n'y a plus que ça, mais c'est le début de l'histoire.
javax.ejb.TransactionManagement
. Voir docs.oracle.com/javaee/7/api/javax/ejb/...retirer de la session.close(); à partir de votre programme, comme quelques-uns de la plus grande transaction de besoin de plus de temps et lors de la fermeture de la connexion problème est survenu. session d'utilisation.grippes() seulement.