在将Hibernate4更新为Hibernate5之后,我提出了这个问题: 休眠必需的事务,尽管这是一个静态方法,不应有任何事务...
javax.persistence.TransactionRequiredException:执行 更新/删除查询 org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1586) 〜[hibernate-core-5.3.6.Final.jar:5.3.6.Final]在 com.security.sa.core.dao.impl.BaseDaoImpl $ 10.doInHibernate(BaseDaoImpl.java:565) 〜[sa-ui-util-3.8.1.0.jar :?]在 org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:384) 〜[spring-orm-5.1.5.RELEASE.jar:5.1.5.RELEASE]在 org.springframework.orm.hibernate5.HibernateTemplate.execute(HibernateTemplate.java:336) 〜[spring-orm-5.1.5.RELEASE.jar:5.1.5.RELEASE]在 com.security.sa.core.dao.impl.BaseDaoImpl.execSQLUpdate(BaseDaoImpl.java:555) 在 com.security.sa.rps.core.rpt.common.DynamicDao.execSQLUpdate(DynamicDao.java:84) 〜[sa-ui-business-3.8.1.0.jar :?]在 com.security.sa.rps.core.rpt.common.rptserver.SearchTask.resetTasks(SearchTask.java:176) 〜[sa-ui-business-3.8.1.0.jar :?]在 com.security.sa.rps.core.rpt.common.rptserver.ServerInitializer $ 2.run(ReportServerInitializer.java:78) [sa-ui-business-3.8.1.0.jar:?]
在Thread中调用静态方法,我认为@Transactional对静态方法无效
// while hibernate5 still throw TransactionRequiredException
new BasicThread("doRestartServerTask") {
@Override
public void run() {
while (isRun() && !isInited) {
try {
// TransactionRequiredException caused by calling this static method
SearchTask.resetTasks();
} catch (Throwable e) {
LOGGER.error(e.getMessage(), e);
}
threadSleep(3 * 1000);
}
}
}.start();
@Transactional //always got problem no matter adding this @Transactional or not
public static void resetTasks() {
DynamicDao rptdao = BasicOps.getReportDbDao();
......
rptdao.execSQLUpdate(Sql)
}
public int execSQLUpdate(final String sql, final Object... params) {
Integer cnt = ((Integer) this.getHibernateTemplate().execute(new HibernateCallback<Object>() {
public Object doInHibernate(Session session) throws HibernateException {
SQLQuery query = session.createSQLQuery(sql);
......
return query.executeUpdate();
}
}