首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >spring + hibernate: createSQLQuery在没有活动事务的情况下无效

spring + hibernate: createSQLQuery在没有活动事务的情况下无效
EN

Stack Overflow用户
提问于 2016-01-19 14:52:39
回答 2查看 918关注 0票数 0

我的代码的旧版本:

代码语言:javascript
代码运行次数:0
运行
复制
    Session session = sessionFactory.openSession();
    Query query = session.createQuery("From User");
    List<Users> users = query.list();
    session.close();

我配置hibernate.cfg.xml文件:

线程

context.xml

当前代码:

代码语言:javascript
代码运行次数:0
运行
复制
  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

代码语言:javascript
代码运行次数:0
运行
复制
<?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";
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-19 16:04:00

正如建议的@eg04lt3r,您不需要在hibernate.cfg.xml中使用这一行

代码语言:javascript
代码运行次数:0
运行
复制
<property name="hibernate.current_session_context_class">thread</property>

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

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

代码语言:javascript
代码运行次数:0
运行
复制
<bean id="sessionFactory"  
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" />

用于事务管理

代码语言:javascript
代码运行次数:0
运行
复制
<tx:annotation-driven transaction-manager="transactionManager"/>

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

在使用会话的类中。

代码语言:javascript
代码运行次数:0
运行
复制
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();
    }

}

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

代码语言:javascript
代码运行次数:0
运行
复制
new Service().list()

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

更新

我重复你的问题。有了这个类,一切都很好。

代码语言:javascript
代码运行次数:0
运行
复制
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注释。你不需要这个

代码语言:javascript
代码运行次数:0
运行
复制
<property name="hibernate.current_session_context_class">thread</property> 
票数 1
EN

Stack Overflow用户

发布于 2016-01-19 15:20:41

如果不使用JTA,只需删除此属性即可。缺省情况下,Spring做管理事务。

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

代码语言:javascript
代码运行次数:0
运行
复制
<bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name = "sessionFactory" ref = "sessionFactory" />
</bean>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34879892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档