J'utilise Hibernate et Spring avec le pattern DAO (toutes les dépendances d'Hibernate dans une classe * DAO.java). J'ai neuf tests unitaires (JUnit) qui créent des objets métier, les sauvegardent et effectuent des opérations sur eux; les objets sont dans un hachage (donc je réutilise les mêmes objets tout le temps).Hibernate/Spring: getHibernateTemplate(). Save (...) Gèle/se bloque
Ma méthode d'installation JUnit appelle ma méthode DAO.deleteAllObjects()
qui appelle getSession().createSQLQuery("DELETE FROM <tablename>").executeUpdate()
pour ma table d'objets métier (une seule).
Un de mes tests unitaires (# 8/9) se bloque. J'ai supposé qu'il s'agissait d'un blocage de base de données, car le fichier journal Hibernate affiche mon instruction delete en dernier. Cependant, le débogage a montré que c'est simplement HibernateTemplate.save(someObject)
qui gèle. (Eclipse montre qu'il gèle sur HibernateTemplate.save(Object)
, ligne 694.)
Il est également intéressant de noter que l'exécution de ce test en lui-même (pas dans la suite de 9 essais) ne pose aucun problème.
Comment diable puis-je résoudre ce problème?
En outre, j'utilise @Entity
annotations, si cela est important.
Modifier: J'ai supprimé la réutilisation de mes objets métier (utilisez des objets uniques dans chaque méthode) - n'a pas fait de différence (reste figé).
Edit: Cela a commencé ruisseler dans d'autres tests aussi (ne peut pas exécuter plus d'une classe de test sans obtenir le gel de quelque chose)
Edit: Briser les essais de gel en deux classes fonctionne. Je vais le faire pour l'instant, aussi honteusement pas DRY que c'est le cas pour avoir deux ou plusieurs classes de test testant l'unité de la même classe d'objet métier.
configuration de la transaction:
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- my bean which is exhibiting the hanging behavior -->
<aop:config>
<aop:pointcut id="beanNameHere"
expression="execution(* com.blah.blah.IMyDAO.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="beanNameHere" />
</aop:config>
commettez-vous des transactions après chaque méthode d'essai? – Bozho
Je suis un hibernate n00b (plus expérimenté avec NHibernate - pratiquement aucune configuration requise), donc je vais faire l'hypothèse que oui, je le suis. J'ai modifié ma réponse pour inclure une configuration transactionnelle. J'ai également essayé d'appeler session.flush() et transaction.flush(), en vain. – ashes999