TransactionRequiredException:对静态方法执行更新/删除查询

时间:2019-08-15 14:21:48

标签: hibernate

在将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();
        }
}

0 个答案:

没有答案
相关问题