我目前正在尝试在TimerTask(Runnable)中进行一个hibernate查询。该任务不保存或更新数据库。它只是检索一份工作清单。任何时候我运行这个任务,我得到HibernateException:无法找到当前的JTA事务。如何在timertask中管理hibernate事务?
我相信这与它从一个可运行的事件开始,因为我在这个TimerTask之外使用了这个相同的查询。
我无法分享我正在使用的代码,因为它是用于工作和专有的。我在这个问题上的研究只能让我真正地使用Spring的解决方案,但我无法使用Spring进行这项工作。
我会尝试做一些伪代码。
public class JobManager extends TimerTask {
@Override
public void run() {
...
List<String> jobs = Handler.getJobs();
...
}
}
public class Handler {
public static List<String> getJobs() {
return DAO.getJobs();
}
}
public class DAO {
public List<Object> getJobs() {
try {
session = HibernateManager.getSessionFactory().getCurrentSession();
Query myQuery = session.createQuery("query string");
List = myQuery.list();
} catch(HibernateException he) {
log.error(he);
}
return list;
}
}
当可运行调用getJobs()时发生异常。这种方法在TimerTask之外的其他地方工作。
我知道这是有限的信息。如果需要,我可以尝试容纳任何其他信息。
我试着打开一个新的会话,但我仍然得到相同的异常。我不知道它是否相关,但run()并不直接调用DAO.getJobs()。它调用我创建的处理程序,然后调用DAO.getJobs()。 – mtanton 2015-02-06 15:36:19
可否请您发布一些更相关的代码? – 2015-02-06 15:37:42
添加了处理程序和dao代码。 – mtanton 2015-02-06 16:16:40