2012-06-03 7 views
8

Podczas uruchamiania metody removeUserFromConference otrzymuję ten wyjątek: metodęPierwsze "org.hibernate.TransactionException: zagnieżdżone transakcje nie są obsługiwane" błąd podczas usuwania

04/06/2012 00:20:48 org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [ConferenceServlet] in context with path [/conf4u] threw exception 
org.hibernate.TransactionException: nested transactions not supported 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152) 
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1396) 
    at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) 
    at $Proxy12.beginTransaction(Unknown Source) 
    at daos.ConferenceDao.isConferenceNameExists(ConferenceDao.java:129) 
    at servlets.ConferenceServlet.removeUser(ConferenceServlet.java:232) 
    at servlets.ConferenceServlet.processRequest(ConferenceServlet.java:79) 
    at servlets.ConferenceServlet.doPost(ConferenceServlet.java:433) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
04/06/2012 00:27:15 org.apache.catalina.core.StandardContext reload 
INFO: Reloading Context with name [/conf4u] has started 
04/06/2012 00:27:15 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/conf4u] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
04/06/2012 00:27:15 org.apache.catalina.core.StandardContext reload 
INFO: Reloading Context with name [/conf4u] is completed 

Dao:

public void removeUserFromConference(Conference conference, User user) { 
    ConferencesUsers conferenceUser = getConferenceUser(conference, user); 

    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 

    session.delete(conferenceUser); 

    session.getTransaction().commit(); 
} 

Klasa model:

@Entity 
@Table(name = "Conferences_Users") 
public class ConferencesUsers implements Serializable { 
    private static final long serialVersionUID = -3401337605668111437L; 
    private Conference conference; 
    private User user; 
    private int userRole; 
    private UserAttendanceStatus attendanceStatus; 
    private boolean notifiedByMail; 

    ConferencesUsers() {} //not public on purpose! 

    public ConferencesUsers(Conference conf, User user, int userRole) { 
     this.conference = conf; 
     this.user = user; 
     this.userRole = userRole; 
     this.attendanceStatus = null; 
     this.notifiedByMail = false; 
    } 

    public ConferencesUsers(Conference conf, User user, int userRole, UserAttendanceStatus attendanceStatus, boolean notifiedByMail) { 
     this.conference = conf; 
     this.user = user; 
     this.userRole = userRole; 
     this.attendanceStatus = attendanceStatus; 
     this.notifiedByMail = notifiedByMail; 
    } 

    @Id 
    @ManyToOne(cascade = CascadeType.ALL) 
    public Conference getConference() { 
     return conference; 
    } 

    public void setConference(Conference conference) { 
     this.conference = conference; 
    } 

    @Id 
    @ManyToOne(cascade = CascadeType.ALL) 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    @Enumerated(EnumType.STRING) 
    public int getUserRole() { 
     return userRole; 
    } 

    public void setUserRole(int userRole) { 
     this.userRole = userRole; 
    } 

    @Nullable 
    public boolean isNotifiedByMail() { 
     return notifiedByMail; 
    } 

    public void setNotifiedByMail(boolean notifiedByMail) { 
     this.notifiedByMail = notifiedByMail; 
    } 

    public UserAttendanceStatus getAttendanceStatus() { 
     return attendanceStatus; 
    } 

    public ConferencesUsers setAttendanceStatus(UserAttendanceStatus attendanceStatus) { 
     this.attendanceStatus = attendanceStatus; 
     return this; 
    } 
} 
+0

Zaktualizuj używaną docelową bazę danych (bez konieczności przeglądania stanowiska, aby ją znaleźć), np. tagi i ewentualnie tytuł. –

Odpowiedz

21

Prawdopodobnie rozpoczęto transakcję i próbujesz rozpocząć inną transakcję bez t po zatwierdzeniu lub wycofaniu poprzedniego. Idiom przy użyciu programowego rozgraniczenie transakcji jest następujący:

try { 
    sess.getTransaction().begin(); 

    // do some work 

    sess.getTransaction().commit() 
} 
catch (RuntimeException e) { 
    sess.getTransaction().rollback(); 
    throw e; 
} 

Jest to uciążliwe i podatne na błędy, a to jest jeden z powodów, za pomocą EJBs lub wiosną mieć transakcji deklaratywnych jest tak przydatne.

+0

Znalazłem problem, który się zaczął -> rozpocznij ... TNX – alonp

+0

@JB Nizet W obliczu problemów para jako zagnieżdżona transakcja nie jest obsługiwana, Chociaż zmieniłem się do twoich sugestii, ale nie wyszło dla mnie. czy możesz pomóc Merowi w tym? – gks

+0

@Stranger: Dlaczego nie chcesz zadać pytania, zamiast zamieszczać komentarze? –

4

Mam ten sam problem wcześniej. Pierwszy bieg:

session.beginTransaction(); 
session.save(something); 
session.getTransaction().commit(); 

gdy coś zapytanie przez:

session.beginTransaction(); 
session.query ... 

samo jest wyjątek w drugim beginTranscation. I rozwiązać go za pomocą

session.getTransaction().begin(); 

zamiast

session.beginTransaction(); 

zarówno w zapytaniu i oszczędzać.

7

Po pierwsze, należy wstrzyknąć hibernateProperties, hibernate.current_session_context_class,

<property name="hibernateProperties"> 
    <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     <prop key="hibernate.show_sql">true</prop> 
     <prop key="hibernate.format_sql">true</prop> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     <prop key="hibernate.current_session_context_class">thread</prop> 
    </props> 
</property> 

następnie można użyć getCurrentSession(), aby uzyskać CurrentSession.

Session session = sessionFactory.getCurrentSession(); 
session.beginTransaction(); 
long count = (Long) session 
     .createQuery("select count(*) from User u where u.name = :name") 
     .setString("name", name).uniqueResult(); 
session.getTransaction().commit(); 
+0

lub: Sesja sesji = sessionFactory.openSession(); session.beginTransaction(); ... zrób coś ... session.getTransaction(). commit(); session.close(); – user2204125

0

Co zrobiłeś tutaj:

Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 

faktycznie próbują wykorzystać otwartą sesję bez zamykania go.

Zdarzyło mi się, a ja w obliczu tego samego problemu, a co zrobiłem to:

Session session = HibernateUtil.getSessionFactory().openSession(); 

// Hibernate bla bla bla transaction or rollback 
// then always close your session : 

if (session.isOpen()) { 
      session.close(); 
     } 

i nie było „Hibernate zagnieżdżonych transakcji Nieobsługiwane Error” podniesiony ponownie ...

0

mogę go rozwiązać za pomocą następującego kodu:

public class UserDaoImpl implements UserDao { 

    Session session = null; 

    public UserDaoImpl() { 
     this.session = HibernateUtil.getSessionFactory().openSession(); 
    } 

    @Override 
    public List<TblUsuario> getAllUsers() { 

     List<TblUsuario> listUsuarios = null; 

     try { 
      org.hibernate.Transaction tx = this.session.getTransaction(); 
      Query query = this.session.createQuery("...."); 
      listUsuarios = query.list(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return listUsuarios; 
    } 

... 

} 
0

Spróbuj użyć ostatecznie do zamknięcia sesji hibernacji, tak:

try { 
    session.getTransaction().begin(); 

    // YOUR CODE 

    session.getTransaction().commit(); 
} catch (RuntimeException e) { 
    try{ 
     session.getTransaction().rollback(); 
    } catch(RuntimeException rbe) { 
     log.error("Couldn’t roll back transaction", rbe); 
    } 
    throw e; 
} finally { 
    if (session != null && session.isOpen()) { 
     session.close(); 
    } 
} 
0

mogę rozwiązać ten problem tworząc sesje zmierzających z

Session session = factory.openSession(); 
session.beginTransaction(); 

//your code here 

session.getTransaction().commit(); 
0

ten wiersz "session.beginTransaction();" zapobiec wielu transakcjom, więc usuń ten wiersz i spróbuj, ponieważ w kwerendzie wyboru nie jest to konieczne, ale kod nie działa po usunięciu, to na końcu tego kodu dodaj "session.rollback();".

Powiązane problemy