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"/>