createQuery is not valid without active transaction

hibernate事务支持

报createQuery is not valid without active transaction错误说明你的方法没有事务支持。

解决办法1:在hibernate或spring配置文件加入

<prop key="hibernate.current_session_context_class">thread</prop>

这句。然后在你调用的方法上显示开启事务:

sessionFactory.getCurrentSession().beginTransaction();

执行自己的操作,然后显示提交

sessionFactory.getCurrentSession().getTransaction().commit();

这样有一个麻烦事就是每次都要显示处理事务,很麻烦,而且相同代码重复出现,明显冗余。

解决办法2:

使用aop,此时依然用sessionFactory.getCurrentSession()做持久化操作。这时要去掉下面一句:

<prop key="hibernate.current_session_context_class">thread</prop>

但加入如下配置:

 <!-- 这里要配置你的bean 和sessionFactory-->
 <bean id="userService" class="**" 
            p:sessionFactory-ref="sessionFactory"/>
   
    <!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 
        并注入SessionFactory的引用 -->
    <bean id="transactionManager" class=
        "org.springframework.orm.hibernate4.HibernateTransactionManager"
        p:sessionFactory-ref="sessionFactory"/>    
    <!-- 配置事务增强处理Bean,指定事务管理器 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 用于配置详细的事务语义 -->
        <tx:attributes>
            <!-- 方法使用默认的事务设置 -->
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <!-- 配置一个切入点,这个Bean的所有方法的执行 -->
        <aop:pointcut id="myPointcut"
            expression="bean(userService)"/>
        <!-- 指定切入点应用txAdvice事务增强处理 -->
        <aop:advisor advice-ref="txAdvice" 
            pointcut-ref="myPointcut"/>
    </aop:config>    
    <aop:aspectj-autoproxy proxy-target-class="true"/>
原文地址:https://www.cnblogs.com/chenhtblog/p/8157289.html