【发布时间】:2011-10-27 11:32:27
【问题描述】:
我在现有系统上工作,需要让我的 Spring 事务管理器附加到从主作业线程产生的线程。我不断收到此异常
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
at parity.model.datamapping.RefreshTask.execute(RefreshTask.java:95)
at com.paritysys.tasks.ASyncTask$1.run(ASyncTask.java:48)
at java.lang.Thread.run(Thread.java:662)
我用事务注释注释了我能想到的所有内容,但我仍然无法清除此错误。
我错过了什么
我的方法
@TransactionAS400
@TransactionScores
public void refresh() {
ASyncTaskWorker worker = new ASyncTaskWorker() {
public void progress(double percentage, String message) {
logger.debug(String.format("%.2f - %s", percentage, message));
}
public void handleException(Throwable e) {
try {
status.allowUpdating(property.getSchema());
} catch (Exception b) {
// consume
}
logger.error("Failed to complete the refresh task", e);
}
public void done(boolean success) {
status.allowUpdating(property.getSchema());
logger.debug(String.format(
"Reset updating status to default for %s",
property.getSchema()));
}
};
RefreshTask refTask = ServiceProviderContext.find(RefreshTask.class);
refTask.init(property, worker);
ASyncTaskHandler.getInstance().add(refTask);
ASyncTaskHandler.getInstance().process();
}
【问题讨论】:
-
您应该发布启动事务的代码以及调用它的代码。
-
好吧,没有启动事务的代码。这就是事务注释在我的 spring bean 中所做的。我的问题似乎是,当 bean 由于某种原因生成到新线程时,它没有意识到 spring 可以在新线程中启动新事务。
-
我希望你使用
@Transactional。但是请发布调用这个带注释的方法的代码。 -
我实际上对同一个问题感兴趣 (How to propagate Spring transaction to another thread)。那其实是Spring的意识形态,所以我们必须同意它......
标签: java spring spring-transactions