【问题标题】:spring mvc + hibernate: createSQLQuery is not valid without active transactionspring mvc + hibernate:createSQLQuery 在没有活动事务的情况下无效
【发布时间】:2016-04-25 02:37:37
【问题描述】:

我的代码的旧版本:

    Session session = sessionFactory.openSession();
    Query query = session.createQuery("From User");
    List<Users> users = query.list();
    session.close();

我配置hibernate.cfg.xml文件:

线程

context.xml

当前代码:

  Session session = sessionFactory.getCurrentSession();
  Transaction tx = session.beginTransaction();
  Query query = session.createQuery("From User");
  List<Users> list = query.list();
  tx.commit();

我必须添加交易代码,否则会出错

org.hibernate.HibernateException: createQuery 在没有活动事务的情况下无效

我缺少什么配置?

ApplicationContext.xml

<?xml version='1.0' encoding='UTF-8' ?>
  ......
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<context:annotation-config />
<context:component-scan base-package="*" />      
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"       class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>


public class IndexController {


@Autowired
UserService users;

@RequestMapping("/index")
public String index(ModelMap model ) {

 User user=   users.test();
 model.put("user", user);
    return "index";
}

【问题讨论】:

  • 请检查stackoverflow.com/questions/18832889/…。它可能对您有所帮助。
  • @eg04lt3r 该帖子建议删除 current_session_context_class。如果我删除它,这将是一个无会话错误。

标签: java hibernate spring-mvc transactions


【解决方案1】:

按照@eg04lt3r 的建议,hibernate.cfg.xml 中不需要此行

<property name="hibernate.current_session_context_class">thread</property>

您需要正确配置您的 spring 上下文。

对于会话工厂,如果您在hibernate.cfg.xmlhibernate.properties 中有映射和属性

<bean id="sessionFactory"  
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" />

用于事务管理

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager"   
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

在使用会话的类中

public class Service {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public List<User> list() {
        Session session = sessionFactory.getCurrentSession();
        Query query = session.createQuery("from User");
        return (List<User>) query.list();
    }

}

你当然不能通过这种方式获得用户

new Service().list()

您需要从 spring 上下文中获取 Service。 Spring 将在Service 中设置sessionFactory 并返回Service 的代理。当您调用 list() 时,代理会打开一个会话并创建一个事务。

更新

我重现您的问题。有了这个类,一切正常

public interface TextService {

    public void save();

    public List<SingleText> test();

}


@Service
public class TextServiceImpl implements TextService {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    @Transactional
    public void save() {
        SingleText text = new SingleText();
        text.setTestText("S.Grey");

        Session session = sessionFactory.getCurrentSession();
        session.save(text);
    }

    @Override
    @Transactional
    public List<SingleText> test() {
        Session session = sessionFactory.getCurrentSession();
        return session.createCriteria(SingleText.class).list();
    }

}

没有我得到的@Transactional 注释

org.hibernate.HibernateException: No Session found for current thread

或(取决于 Spring 版本)

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

所以你只需要@Transaction 注释。而你不需要这个

<property name="hibernate.current_session_context_class">thread</property> 

【讨论】:

  • 你必须确定你从spring上下文中获取了UserService?我不明白这个。
  • @JohnZhang Spring 必须设置这个 @Autowired UserService users; 而不是你 UserService users = new UserService();
  • @JohnZhang 您可以将您的项目放在 github 或 bitbucket 上,并将链接添加到您的问题中。我认为它有帮助。
【解决方案2】:

如果您不使用 JTA,只需删除此属性。 Spring默认做管理事务。

并在spring配置中定义事务管理器:

<bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name = "sessionFactory" ref = "sessionFactory" />
</bean>

【讨论】:

  • 如果我删除它,这将是一个无会话错误,当我使用 sessionFactory.getCurrentSession();
  • 是的,spring 将返回当前会话。
  • org.hibernate.HibernateException: No Session found for current thread
猜你喜欢
  • 2016-08-20
  • 2015-05-12
  • 2014-08-19
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2015-10-19
  • 1970-01-01
相关资源
最近更新 更多