gpt4 book ai didi

java - Spring MVC+ hibernate : createSQLQuery is not valid without active transaction

转载 作者:行者123 更新时间:2023-12-01 10:34:16 25 4
gpt4 key购买 nike

我的代码的旧版本:

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

我配置hibernate.cfg.xml文件:

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

上下文.xml

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

当前代码:

  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 is not valid without active transaction

我的配置缺少什么?

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";
}

最佳答案

按照 @eg04lt3r 的建议,您不需要在 hibernate.cfg.xml 中添加这一行

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

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

对于 session 工厂,如果您在 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>

在使用 session 的类中

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() 时,代理会打开一个 session 并创建一个事务。

更新

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

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:未找到当前线程的 session

或者(取决于 Spring 版本)

org.hibernate.HibernateException:无法获取当前线程的事务同步 session

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

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

关于java - Spring MVC+ hibernate : createSQLQuery is not valid without active transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com