Hibernate: createQuery 没有主动交易无效

我的项目有一些问题 Spring + Hibernate. 当我尝试获取数据时,我有:

HTTP 状态500请求失败; 嵌套异常 org.hibernate.HibernateException: createQuery 不可接受,没有活动交易
这是我的代码 xml config:


<beans xmlns="[url=http://www.springframework.org/schema/beans"]http://www.springframework.org/schema/beans"[/url] xmlns:tx="[url=http://www.springframework.org/schema/tx"]http://www.springframework.org/schema/tx"[/url] xmlns:xsi="[url=http://www.w3.org/2001/XMLSchema-instance"]http://www.w3.org/2001/XMLSchema-instance"[/url] xsi:schemalocation="[url=http://www.springframework.org/schema/beans]http://www.springframework.org/schema/beans[/url]
[url=http://www.springframework.org/schema/beans/spring-beans-3.0.xsd]http://www.springframework.org ... 0.xsd[/url]
[url=http://www.springframework.org/schema/tx]http://www.springframework.org/schema/tx[/url]
[url=http://www.springframework.org/schema/tx/spring-tx.xsd">]http://www.springframework.org ... gt%3B[/url]
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/users"></property>
<property name="username" value="root"></property>
<property name="password" value="12345"></property>
</bean>
<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="SessionFactory">
<property name="dataSource" ref="dataSource"></property>
<property name="annotatedClasses">
<list>
<value>com.springapp.model.User</value>
<value>com.springapp.model.UserRole</value>
<value>com.springapp.model.Project</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
<bean class="org.springframework.orm.hibernate4.HibernateTransactionManager" id="transactionManager">
<property name="sessionFactory" ref="SessionFactory"></property>
</bean>


一种方法 DAO


@Override
public List<user> showAllUsers//{
List<user> users = new ArrayList<user>//;
Session session = this.sessionFactory.getCurrentSession//;
users = session.createQuery/"from User"/.list//;
return users;
}


所有服务都标记为事务性。 我删除时
<prop key="hibernate.current_session_context_class">thread</prop>

我有 Hibernate 错误:找不到当前流的会话。 我怎么解决这个问题?

UPDATED #2

全道


@Autowired
private SessionFactory sessionFactory;

@SuppressWarnings/"unchecked"/
public User findByUserName/String username/ {

List<user> users = new ArrayList<user>//;

Session session = this.sessionFactory.getCurrentSession//;
session.beginTransaction//;
users = session
.createQuery/"from User where username=?"/
.setParameter/0, username/.list//;
session.getTransaction//.commit//;
session.close//;
if /users.size// &gt; 0/ {
return users.get/0/;
} else {
return null;
}
}

@Override
public void addUser/User user/{
Session session = this.sessionFactory.getCurrentSession//;
session.save/user/;
}

@Override
public void deleteUser/User user/{
Session session = this.sessionFactory.getCurrentSession//;
System.out.println/user.getUsername///;
session.delete/user/;
}
@Override
public void verifyUser/User user/{
Session session = this.sessionFactory.getCurrentSession//;
session.update/user/;
}
@Override
public List<user> showAllUsers//{
List<user> users = new ArrayList<user>//;
Session session = this.sessionFactory.getCurrentSession//;
session.beginTransaction//;
users = session.createQuery/"from User"/.list//;
session.getTransaction//.commit//;
session.close//;
return users;
}


我现在有 "嵌套异常 org.hibernate.SessionException: 会议已经关闭"
- 怎么了?

更新

这就是我称之为这些方法的方式:


@RequestMapping/"/admin/updateUser"/
public String updateUser/ModelMap model,@ModelAttribute/"userId"/ String username/
{
User user = this.userService.findByUserName/username/;
if/user.isEnabled/// user.setEnabled/false/;
else user.setEnabled/true/;
this.userService.updateUser/user/;
return "redirect:/admin";
}
@RequestMapping/"/admin"/
public String adminPanel/ModelMap model/
{
List<user> users = this.userService.showAllUsers//;
model.addAttribute/"users",users/;
return "adminpanel";
}


</user></user></user></user></user></user></user></user></user></beans>
已邀请:

小明明

赞同来自:

添加


session.beginTransaction//;


在创建请求之前。
所以:


List<user> users = new ArrayList<user>//;
Session session = this.sessionFactory.getCurrentSession//;
session.beginTransaction//;
users = session.createQuery/"from User"/.list//;
return users;


为了改变

这意味着您正在尝试运行交易,而您尚未录制或未出发其他交易。 您必须修复您的会话。 /最好关闭会话/ 通过


session.getTransaction//.commit//;
session.close//;


在你之后 createQuery.
把它添加到你的 showAllUsers// 和 findByUserName//

祝你好运!
</user></user>

诸葛浮云

赞同来自:

创建会话对象时,使用:


Session session = this.sessionFactory.openSession//;


反而


Session session = this.sessionFactory.getCurrentSession//;

要回复问题请先登录注册