Request processing failed; nested exception is org

2019-07-26 22:37发布

问题:

I am trying to insert a form data into a Mysql database using model using hibernate.

Application Details: I am trying to insert a Tutor(lecture/Teacher) in the Database; Tutor has Name,email, img, speciality, and degree all are String except img is longblob

I created My model, Mapped with database field and created a JSP form.Whenever I hit submit there is a exception...The following are detail of my problem, please let me know in comments if any further information is required. Thank you for your time.

Here is my model.

Tutor.java(model)

package com.suvrat;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotBlank;

import com.mysql.jdbc.Blob;
@Entity
@Table(name ="tutor")
public class Tutor {


    public Tutor() {

    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "tutor_id", updatable = false, nullable = false)
    public int tutor_id;

    @Column(name = "tutor_name")
    @NotBlank(message="Required")
    @NotNull(message="Required")
    public String tutor_name;

    @Column(name = "tutor_email")
    @NotBlank(message="Required")
    @NotNull(message="Required")
    public String tutor_email;

    @Column(name = "img")
    public byte[] img;

    @Column(name = "speciality")
    @NotBlank(message="Required")
    @NotNull(message="Required")
    public String speciality;

    @Column(name = "phone_number")
    @NotBlank(message="Required")
    @NotNull(message="Required")
    public String phone_number;

    @Column(name = "degree")
    @NotBlank(message="Required")
    @NotNull(message="Required")
    public String degree;

    public int getTutor_id() {
        return tutor_id;
    }

    public void setTutor_id(int tutor_id) {
        this.tutor_id = tutor_id;
    }

    public String getTutor_name() {
        return tutor_name;
    }

    public void setTutor_name(String tutor_name) {
        this.tutor_name = tutor_name;
    }

    public String getTutor_email() {
        return tutor_email;
    }

    public void setTutor_email(String tutor_email) {
        this.tutor_email = tutor_email;
    }

    public byte[] getImg() {
        return img;
    }

    public void setImg(byte[] img) {
        this.img = img;
    }

    public String getSpeciality() {
        return speciality;
    }

    public void setSpeciality(String speciality) {
        this.speciality = speciality;
    }

    public String getPhone_number() {
        return phone_number;
    }

    public void setPhone_number(String phone_number) {
        this.phone_number = phone_number;
    }

    public String getDegree() {
        return degree;
    }

    public void setDegree(String degree) {
        this.degree = degree;
    }



}

The controller class

package com.suvrat;

import javax.validation.Valid;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

@Controller
public class HandleTutor {

    @RequestMapping("/insertTutor")
    public String insertBegin(Model m) {
        m.addAttribute("tutor", new Tutor());
        return "insertTutor";
    }

    @RequestMapping(value = "/ProcessTutorRegistration",method = RequestMethod.POST)
    public String ProcessUserRegistration(@RequestParam("fileUpload") CommonsMultipartFile fileUpload,
            @Valid @ModelAttribute("tutor") Tutor tutor, BindingResult theBindingResult) {
        if (theBindingResult.hasErrors()) {
            return "insertTutor";
        } else {
            SessionFactory factory = new Configuration().configure("/resources/hibernate.cfg.xml")
                    .addAnnotatedClass(User.class).buildSessionFactory();

            Session session = factory.getCurrentSession();

            try {

                if (fileUpload != null) {


                        System.out.println("Saving file: " + fileUpload.getOriginalFilename());

                        tutor.setImg(fileUpload.getBytes());
                        System.out.println("**********In IF********");

                }

                System.out.println("Transaction");
                session.beginTransaction();
                session.save(tutor);
                session.getTransaction().commit();
                System.out.println("Done!");
            } finally {
                factory.close();
            }
            return "user-confirm";
        }

    }
}

And the JSP page

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<style type="text/css">
.error {
    color: red;
}
</style>

</head>
<body>
    <center>
        <h1>Insert Tutor!</h1>
        <form:form method="post" action="ProcessTutorRegistration" modelAttribute="tutor" enctype="multipart/form-data">

    Tutor Name <form:input path="tutor_name" />
            <form:errors path="tutor_name" cssClass="error" />
            <br>
            <br>
    Email  <form:input path="tutor_email" />
            <form:errors path="tutor_email" cssClass="error" />
            <br>
            <br>
    Image <input name="fileUpload" type="file" size="50" />
            <form:errors path="img" cssClass="error" />
            <br>
            <br>
    Speciality <form:input path="speciality" />
            <form:errors path="speciality" cssClass="error" />
            <br>
            <br>
    Phone Number <form:input  path="phone_number" />
            <form:errors path="phone_number" cssClass="error" />
            <br>
            <br>
    Degree <form:input  path="degree" />
            <form:errors path="degree" cssClass="error" />
            <br>
            <br>

            <input type="submit" value="Submit">
        </form:form>

    </center>
</body>
</html>

The Database Schema

tutor_id    1       NO  int 10  0   
tutor_name  2       NO  varchar         
tutor_email 3       NO  varchar         
img         4       NO  longblob            
speciality  5       NO  varchar         
phone_number6       NO  varchar         
degree      7       NO  varchar     

I am recieving following exception when I submit the form...

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/Imperio] threw exception [Request processing failed; nested exception is org.hibernate.MappingException: Unknown entity: com.suvrat.Tutor] with root cause
org.hibernate.MappingException: Unknown entity: com.suvrat.Tutor
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:618)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1595)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:667)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:659)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:654)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.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:338)
    at com.sun.proxy.$Proxy50.save(Unknown Source)
    at com.suvrat.HandleTutor.ProcessUserRegistration(HandleTutor.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Hibernate Config

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- JDBC Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/tutorsystem?useSSL=false</property>
        <property name="connection.username">xxxx</property>
        <property name="connection.password">xxxx</property>

        <!-- JDBC connection pool settings ... using built-in test pool -->
        <property name="connection.pool_size">1</property>

        <!-- Select our SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Echo the SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Set the current session context -->
        <property name="current_session_context_class">thread</property>

    </session-factory>

</hibernate-configuration>

Web XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">


    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


</web-app>

回答1:

Inside of your sessionFactory definition you can define in which packages your model is located. Add this property insode of your <session-factory>:

<property name="packagesToScan" value="com.suvrat"/>

Or you could add this class explicitly to SessionFactory defintion in Java:

SessionFactory factory = new Configuration().configure("/resources/hibernate.cfg.xml")
                .addAnnotatedClass(Tutor.class)
                .addAnnotatedClass(User.class)
                .buildSessionFactory();

In most cases you will be using package-scan appoach.

Comment:

Because you are using Spring, I would advise to extract SessionFactory to another @Configuration, and only inject it in the Controller. Your application should have only one SessionFactory. Secondly it would be much easyer to test the controller, without any Database access.

So create a HibernateConfig like so:

@Configuration
public class HibernateConfig {
   @Bean
   public SessionFactory sessionFactory(){
     return  new Configuration().configure("/resources/hibernate.cfg.xml")
                    .addAnnotatedClass(Tutor.class)
                    .addAnnotatedClass(User.class)
                    .buildSessionFactory();
   }
}

And change your Controller like so:

@Controller
public class HandleTutor {  
   @Autowired
   private SessionFactory sessionFactory;
}


回答2:

In the Controller class

Instead of passing Tutor.class I was passing User.class.

SessionFactory factory = new Configuration().configure("/resources/hibernate.cfg.xml")
                    .addAnnotatedClass(U̶s̶e̶r̶  Tutor.class).buildSessionFactory();