Hibernate: createQuery nie działa bez aktywnej transakcji


Mam problemy z moim projektem Spring + Hibernate. Kiedy próbuję uzyskać dane, mam:
Stan HTTP 500 - przetwarzanie żądania nie powiodło się; wyjątek zagnieżdżony org.hibernate.HibernateException: createQuery nie jest poprawne bez aktywnej transakcji
Oto mój kod dla konfiguracji xml:
<beans xmlns="[url=http://www.springframework.org/schema/beans"]http://www.springframework.org/schema/beans"[/url]
xmlns:xsi="[url=http://www.w3.org/2001/XMLSchema-instance"]http://www.w3.org/2001/XMLSchema-instance"[/url] xmlns:tx="[url=http://www.springframework.org/schema/tx"]http://www.springframework.org/schema/tx"[/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"><bean]http://www.springframework.org ... Bbean[/url] id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/users"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</bean><bean id="SessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<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"/><bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory"/>
</bean>

Metoda z 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;
}

Wszystkie usługi są oznaczone jako transakcyjne. Kiedy usuwam
& < prop key = "hibernate.current_session_context_class" & > wątek & </prop & >
mam błąd hibernacji: nie znaleziono sesji dla bieżącego wątku. Jak mogę rozwiązać ten problem?

UPDATED #2

pełne Tao
@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() > 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;
}

Teraz mam „zagnieżdżony org.hibernate.SessionException: sesja została już zamknięta”
- O co chodzi?

Aktualizacja

tak nazwałem te metody:
@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";
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dodaj
session.beginTransaction();

Przed utworzeniem wniosku.
Więc:
List<User> users = new ArrayList<User>();
Session session = this.sessionFactory.getCurrentSession();
session.beginTransaction();
users = session.createQuery("from User").list();
return users;


Zmienić

Oznacza to, że próbujesz rozpocząć transakcję, dopóki nie zatwierdziłeś ani nie wycofałeś innej transakcji. Powinieneś zatwierdzić sesję (a najlepiej zamknąć sesję)
session.getTransaction().commit();
session.close();

Po utworzeniu pliku createQuery.
Dodaj go do swojego showAllUsers () i znajdźByUserName ()
Powodzenia!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Podczas tworzenia obiektu sesji użyj:
Session session = this.sessionFactory.openSession();

zamiast
Session session = this.sessionFactory.getCurrentSession();

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się