2016-07-27 15 views
-3

我是hibernate的新手,這是我第二個使用hibernate和Struts2的示例,JSP表單應該將數據存儲在數據庫中,但獲取以下例外。爲什麼不工作?使用Hibernate和Struts 2並獲取異常java.lang.IllegalStateException:事務已經生效

發佈異常的堆棧跟蹤其中談到:

java.lang.IllegalStateException: Transaction already active 
org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:52) 
    com.InstaRecharge.hbm.UserDao.register(UserDao.java:16) 
    com.InstaRecharge.action.Register.execute(Register.java:63) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:871) 
    ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1294) 
    ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68) 
    com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:117) 
    com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:108) 
    ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1370) 
    ognl.ASTMethod.getValueBody(ASTMethod.java:90) 
    ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) 
    ognl.SimpleNode.getValue(SimpleNode.java:258) 
    ognl.Ognl.getValue(Ognl.java:494) 
    ognl.Ognl.getValue(Ognl.java:458) 
    com.opensymphony.xwork2.ognl.OgnlUtil$2.execute(OgnlUtil.java:315) 
    com.opensymphony.xwork2.ognl.OgnlUtil.compileAndExecute(OgnlUtil.java:346) 
    com.opensymphony.xwork2.ognl.OgnlUtil.getValue(OgnlUtil.java:313) 
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:430) 
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:290) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:251) 
    org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:168) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265) 
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:76) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:125) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:253) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:140) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245) 
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) 
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:567) 
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81) 
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745)` 

這裏是Register.java

import com.InstaRecharge.hbm.UserDao; 
import com.opensymphony.xwork2.ActionSupport; 
import java.sql.*; 
public class Register extends ActionSupport { 
    private String id; 
    private String name; 
    private String email;; 
    private int phone; 
    private String password; 
    private String repassword; 

    //getter setter methods 


    public String execute() throws SQLException{ 

     /* ****for oracle database**** 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 


     Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","SYSTEM","SYSTEM"); 


     ####MySql database### 
     try{Class.forName("com.mysql.jdbc.Driver");}catch(Exception e){e.printStackTrace();} 

     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","system"); 
     PreparedStatement ps = con.prepareStatement("insert into userdetail values(?,?,?,?)"); 
     ps.setString(1, email); 
     ps.setString(2, password); 
     ps.setString(3, name); 
     ps.setInt(4, phone); 
     int i= ps.executeUpdate();*/ 

     int i=UserDao.register(this); 
     if(i>0){ 
      return SUCCESS; 


     }else{ 
      return ERROR; 
     } 
    } 
    String blank="Cannot be blank!!"; 

    public void validate(){ 
     int e = email.length(); 
     int i = email.indexOf("@"); 
     int d =email.indexOf("."); 

     if (name.length()<1){ 
      addFieldError("name", blank); 
     } 

     if(email.length()<1){ 
      addFieldError("email", blank); 
     }else if(i>0 && i<(e-5) && d>0 && d< (i-1)){ 
      //do nothing 
     }else{ 
      addFieldError("email", "Invalid e-mail id!!!"); 

     } 
     if(phone < 1){ 
      addFieldError("phone", blank); 
     } 
     if(password.length()<1){ 
      addFieldError("password", blank); 
     } 

     if(repassword.equals(password)){ 
     }else{ 
      addFieldError("repassword", "Password did not match!"); 

     } 
    } 



} 

這是我UserDao.java

import org.hibernate.SessionFactory; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 
public class UserDao { 
public static int register(Register u){ 
    int i=0; 
    Configuration cfg = new Configuration(); 
    cfg.configure("hibernate.cfg.xml"); 
    SessionFactory factory = cfg.buildSessionFactory(); 
    Session session = factory.openSession(); 

    Transaction t = session.beginTransaction(); 
    t.begin(); 

    i=(Integer)session.save(u); 
    t.commit(); 
    session.close(); 
    return i; 
} 
} 
+0

請在UserDao中更新您的問題,例如您如何獲取Hibernate會話以及您的代碼在'UserDao.register'內執行的操作。根據您迄今爲止提供的內容,您的會話/實體管理器已經有一個活動會話,並且您正在嘗試啓動另一個活動會話。 – Naros

+0

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 –

+0

使用'getCurrentSession'而不是每次打開會話。 –

回答

2

有一個基本的缺陷在Nathan Hughes建議的代碼中,我正在詳細闡述它。

您嘗試創建的會話是在sessionfactory的幫助下完成的。現在,由於您每次都嘗試創建一個sessionfactory,因此線程可能會訪問已由上一個線程啓動的事務。這違反了交易的ACID屬性。

最簡單的解決方案是有一個靜態類級別的sessionfactory,它只會在應用程序的生命週期中返回一次sessionfactory。

import org.hibernate.SessionFactory; 
    import org.hibernate.Session; 
    import org.hibernate.Transaction; 
    import org.hibernate.cfg.Configuration; 
    public class UserDao { 
    private static SessionFactory factory; 
    public static int register(Register u){ 
     int i=0; 

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

     Transaction t = session.beginTransaction(); 
     t.begin(); 

     i=(Integer)session.save(u); 
     t.commit(); 
     session.close(); 
     return i; 
    } 



public static SessionFactory getSessionFactory(){ 
     Configuration cfg = new Configuration(); 
     cfg.configure("hibernate.cfg.xml"); 

     if(factory==null) 
     factory = cfg.buildSessionFactory(); 

     return factory; 
    } 
    } 

雖然這是很基本的解決方案,我會建議處理使用標準的JEE註釋或Spring的事務管理註釋的交易。

+0

謝謝,對我有用的是我刪除了't.bigin()' –

+0

請投它:) –

相關問題