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";
}
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
2 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Przed utworzeniem wniosku.
Więc:
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ę)
Po utworzeniu pliku createQuery.
Dodaj go do swojego showAllUsers () i znajdźByUserName ()
Powodzenia!
Anonimowy użytkownik
Potwierdzenie od:
zamiast