从我的 junit 测试中,我调用了一个简单的方法来清除我的表:
@AfterClass
public static void runAfterClass() {
//Clear db contents after tests
// NOTE this clears ALL data from the table
try {
System.out.println("deleting db contents");
HibFunction.clearTable();
} catch (Exception e) {
System.out.println("Couldnt delete db contents");
e.printStackTrace();
}
清除表如下所示:
public static void clearTable()
{
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try{
transaction = session.beginTransaction();
session.createQuery("delete from metadataPoC.hib.TestHib").executeUpdate();
transaction.commit();
}catch (HibernateException e) {
transaction.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
所有相当简单的东西,但是我的控制台输出仅此而已:
deleting db contents
我不确定为什么只是一个简单的delete from classname
可能会导致此类问题。该程序刚刚挂起了 10 分钟,没有失败或 junit 测试的结果。
编辑
但是,我已经将问题隔离到 clearTable() 方法中,它在代码中移动了它,一旦它进入,就挂起!我不确定确切的原因,从我在网上找到的信息来看,我的方法从我所看到的似乎是正确的。但必须是这种方法。我把它放在我的@BeforeClass
里,当它到达它时,测试就冻结了。
底线是clearTable()方法存在问题。你不知道:(什么
编辑 2
将问题追踪到命令的 executeupdate 部分,无论出于何种原因,一旦到达:
ParseUtil.encodePath(String, boolean) 行: 100
clearTable()
方法的事务和测试方法的事务之间的死锁。
确保在离开测试方法时完成(提交或回滚)所有事务。