2016-07-27 6 views
-3

Ich bin neu zu überwintern und dies ist mein zweites Beispiel mit Hibernate und Struts2, das JSP-Formular soll die Daten in der Datenbank speichern, aber die bekommen unter Ausnahme.Warum funktioniert nicht? Hibernate und Struts 2 und erhalten Ausnahme java.lang.IllegalStateException: Transaktion bereits aktiv

Veröffentlichung der Stacktrace der Ausnahme, die kommt:

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)` 

Hier ist 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!"); 

     } 
    } 



} 

Das ist mein 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

Bitte aktualisieren Sie Ihre Frage mit Details in UserDao wie z. B. Wie erhalten Sie Ihre Hibernate-Sitzung und was ist Ihr Code in "UserDao.register". Nur basierend auf dem, was Sie bisher bereitgestellt haben, hat Ihr Session/Entitymanager bereits eine aktive Sitzung und Sie versuchen, eine andere zu starten, solange eine aktiv ist. – Naros

+0

Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht?") Müssen das gewünschte Verhalten, ein bestimmtes Problem oder einen Fehler und den kürzesten Code enthalten, der für die Reproduktion in der Frage erforderlich ist. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels. –

+0

Verwenden Sie 'getCurrentSession' anstatt die Sitzung jedes Mal zu öffnen. –

Antwort

2

Es gibt einen grundlegenden Fehler ist, in dem Code, wie er von Nathan Hughes vorgeschlagen wurde, und ich werde es nur näher erläutern.

Die Sitzung, die Sie erstellen möchten, wird mit Hilfe von sessionfactory erstellt. Jetzt, da Sie jedes Mal versuchen, eine Sessionfactory zu erstellen, besteht die Möglichkeit, dass Threads auf Transaktionen zugreifen, die bereits vom vorherigen Thread gestartet wurden. Dies ist eine Verletzung der ACID-Eigenschaft für eine Transaktion.

Die einfachste Lösung ist eine statische Klassenstufe sessionfactory, die sessionfactory nur einmal in der Laufzeit einer Anwendung zurückgibt.

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

Obwohl diese sehr einfache Lösung ist, schlage ich vor, die Transaktionen unter Verwendung von Standard JEE Anmerkungen oder Spring-Transaktionsmanagement Anmerkungen zu handhaben.

+0

Danke, was bei mir funktioniert hat, ich habe das 't.bigin()' –

+0

entfernt. Bitte stimme es ab :) –

Verwandte Themen