2012-06-03 26 views
8

Khi chạy phương pháp removeUserFromConference nhận được ngoại lệ này: Phương phápBắt "org.hibernate.TransactionException: lồng giao dịch không được hỗ trợ" lỗi khi xóa

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 

Đạo:

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(); 
} 

Mô hình lớp:

@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

Vui lòng cập nhật cơ sở dữ liệu đích được sử dụng (mà không cần đào qua bài đăng để tìm), ví dụ: thẻ và có thể là tiêu đề. –

Trả lời

21

Có thể bạn đã bắt đầu một giao dịch và cố gắng bắt đầu một giao dịch khác với t đã cam kết hoặc khôi phục trước đó. Các thành ngữ khi sử dụng ranh giới giao dịch có lập trình là một trong những sau:

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

    // do some work 

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

Đây là cồng kềnh và dễ bị lỗi, và đây là một trong những lý do tại sao sử dụng EJB hoặc Spring có giao dịch khai báo là rất hữu ích.

+0

Tôi thấy vấn đề đã bắt đầu -> bắt đầu ... TNX – alonp

+0

@JB Nizet Đối mặt với vài vấn đề như giao dịch lồng nhau không được hỗ trợ, Mặc dù tôi đã thay đổi đề xuất của bạn nhưng không làm việc cho tôi. bạn có thể giúp đỡ trong việc này? – gks

+0

@Stranger: Tại sao bạn không đặt câu hỏi thay vì đăng nhận xét? –

4

Tôi có cùng một vấn đề trước đây. chạy đầu tiên:

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

khi một cái gì đó truy vấn bằng cách:

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

cùng một ngoại lệ được nâng lên ở thứ hai beginTranscation. Tôi giải quyết nó bằng cách sử dụng

session.getTransaction().begin(); 

thay vì

session.beginTransaction(); 

cả trong truy vấn và lưu lại.

7

Trước hết, bạn nên tiêm 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> 

sau đó bạn có thể sử dụng getCurrentSession() để có được những 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

hoặc: Phiên phiên = sessionFactory.openSession(); session.beginTransaction(); ... làm điều gì đó ... session.getTransaction(). commit(); session.close(); – user2204125

0

gì bạn đã làm ở đây:

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

là thực sự cố gắng sử dụng một phiên mở mà không đóng nó.

Nó xảy ra với tôi và tôi đã phải đối mặt với cùng một vấn đề, và những gì tôi đã làm là:

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

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

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

và không có "Hibernate Nested giao dịch Not Supported Lỗi" lớn lên một lần nữa ...

0

tôi có thể giải quyết nó với đoạn mã sau:

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

Hãy thử sử dụng cuối cùng để đóng phiên Hibernate của bạn, như thế này:

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

tôi giải quyết vấn đề này tạo ra phiên khác nhau với

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

//your code here 

session.getTransaction().commit(); 
0

dòng này "session.beginTransaction();" ngăn chặn nhiều giao dịch để loại bỏ dòng này và thử vì trong truy vấn chọn nó không phải là cần thiết nhưng mã nó không hoạt động sau khi loại bỏ điều này sau đó ở phần cuối của mã này thêm "session.rollback();".

Các vấn đề liên quan