我正在使用Hibernate和Spring与DAO模式(所有Hibernate依赖项在*DAO.java类中)。我有九个单元测试(JUnit),它们创建一些业务对象,保存它们并对它们执行操作;对象在哈希中(因此我一直重复使用相同的对象)。
我的JUnit设置方法调用我的
我的其中一个单元测试(#8/9)会冻结。我认为这是数据库死锁,因为Hibernate日志文件显示我的删除语句最后。但是,调试显示只是
还值得注意的是,单独运行此测试(而不是在9个测试套件中)不会引起任何问题。
我应该如何排除故障并修复呢?
另外,如果有关系的话,我正在使用@Entity注释。
编辑:我删除了业务对象的重用(在每种方法中使用唯一的对象)-没有任何区别(仍然冻结)。
编辑:这也开始渗入其他测试中(不能运行多个测试类而不会出现任何冻结)。
编辑:将冻结测试分成两个类可行。尽管这样做可能会让人感到羞耻,因为有两个或更多测试类对同一个业务对象类进行单元测试。
事务配置:
我的JUnit设置方法调用我的
DAO.deleteAllObjects()
方法,该方法为我的业务对象表(仅一个)调用getSession().createSQLQuery("DELETE FROM <tablename>").executeUpdate()
。我的其中一个单元测试(#8/9)会冻结。我认为这是数据库死锁,因为Hibernate日志文件显示我的删除语句最后。但是,调试显示只是
HibernateTemplate.save(someObject)
在冻结。(Eclipse显示它在HibernateTemplate.save(Object)
,第694行上冻结。)还值得注意的是,单独运行此测试(而不是在9个测试套件中)不会引起任何问题。
我应该如何排除故障并修复呢?
另外,如果有关系的话,我正在使用@Entity注释。
编辑:我删除了业务对象的重用(在每种方法中使用唯一的对象)-没有任何区别(仍然冻结)。
编辑:这也开始渗入其他测试中(不能运行多个测试类而不会出现任何冻结)。
编辑:将冻结测试分成两个类可行。尽管这样做可能会让人感到羞耻,因为有两个或更多测试类对同一个业务对象类进行单元测试。
事务配置:
<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>