Я получаю эту ошибку «Не удалось получить конструктор для org.hibernate.persister.entity.SingleTableEntityPersister»?

#java #spring #spring-boot #hibernate #spring-mvc

#java #spring #весенняя загрузка #переход в спящий режим #spring-mvc

Вопрос:

Я пытаюсь создать приложение spring-hibernate, но я получаю эту ошибку

Request processing failed; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister

Я знаю, что эта ошибка возникает, когда он пытается найти получатели и установщики и не может их получить. Но я правильно проверил свои геттеры и сеттеры, они верны.

Пожалуйста, помогите мне с этим.

Моя структура такая

введите описание изображения здесь

И код — это

  1. Employee.java
 package com.wipro.config;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="empdata")
public class Employee {
    
    @Id
    private String empname;
    @Column(name="designation",length=15)
    private String designation;
    @Column(name="email",length=25)
    private String email;
    
    public String getEmpname() {
        return empname;
    }
    public void setEmpname(String empname) {
        this.empname = empname;
    }
    public String getDesignation() {
        return designation;
    }
    public void setDesignation(String designation) {
        this.designation = designation;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    
    
    
}
  
  1. EmployeeDao.java
 package com.wipro.config;

import java.io.File;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class EmployeeDao {

    private SessionFactory factory;
    private Session session;
    private Transaction t;
    
    public EmployeeDao() {
        
    }
    
    public void saveData(Employee e) {
        
        factory =new Configuration().configure(new File("F:/Wipro teachings/springg/crud/src/main/java/com/wipro/config/hibernate.cfg.xml")).buildSessionFactory();
            session=factory.openSession();
            t=session.beginTransaction();
            session.save(e);
            t.commit();
        
    }

}
  
  1. ControllerDemo.java
 package com.wipro.controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wipro.config.Employee;
import com.wipro.config.EmployeeDao;

@Controller
public class ControllerDemo {
    private ApplicationContext conn;
    
    public ControllerDemo() {
        
    }
    @RequestMapping("/home")
    public String view1() {
        return "home";
    }
    
    @RequestMapping("/register")
    public String view2(Model m) {
        conn=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        Employee emp=conn.getBean("info",Employee.class);
        m.addAttribute("bean",emp);
        return "register";
    }
    
    @RequestMapping("/store")
    public String view3(@ModelAttribute("bean") Employee e,Model m) {
        conn=new ClassPathXmlApplicationContext("ApplicationContext.xml");
        EmployeeDao obj=conn.getBean("dao",EmployeeDao.class);
        obj.saveData(e);
        m.addAttribute("msg","Record Inserted Successfully");
        return "register";
    }
    
}
  
  1. hibernate.cfg.xml
 <?xml version="1.0" encoding="UTF-8"?>
<!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>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">Musu</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@Localhost:1521:orcl</property>
        <property name="hibernate.connection.username">sys as sysdba</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle8iDialect</property>
        <property name="dialect">org.hibernate.dialect.Oracle8iDialect</property> 
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>  
    
    <mapping class="com.wipro.config.Employee"/>
    
    
    </session-factory>
</hibernate-configuration>
  
  1. ApplicationContext.xml
 <?xml version="1.0" encoding="UTF-8"?>

<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
               
   
<bean id="info" class="com.wipro.config.Employee"></bean>
 
 <bean id="dao" class="com.wipro.config.EmployeeDao"></bean>              
</beans>             
  
  1. home.jsp
 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="register">Register</a>
</body>
</html>
  
  1. register.jsp
 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    <%@page isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h1>Register Page</h1>
    <form:form action="store" method="post" modelAttribute="bean">
        Enter name=<form:input path="empname"/><br><br>
        Enter designation=<form:input path="designation"/><br><br>
        Enter email=<form:input path="email"/><br><br>  
    <input type="submit" value="register">
    </form:form>
    <br>
    <h2>${msg}</h2>
    
</body>
</html>
  
  1. spring-servlet.xml
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="  
        http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context.xsd  
        http://www.springframework.org/schema/mvc  
        http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 
        
        <context:component-scan base-package="com.wipro"></context:component-scan>
        <mvc:annotation-driven></mvc:annotation-driven>
        <bean id="vr" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
        
        </beans>

  
  1. web.xml
 <!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

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

    <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
  
  1. index.jsp
 <html>
<body>
<h2>Hello World!</h2>
<a href="home">Home</a>
</body>
</html>
  

Комментарии:

1. Пожалуйста, добавьте конструктор по умолчанию без аргументов для вашего entity Employee и посмотрите, что произойдет. государственный служащий(){}

2. Попробовал, что все та же ошибка.

3. Эта ошибка довольно широкая. Интернет показывает пользователей, у которых была эта ошибка при переходе на Java 11 с 9 или обновлении версии hibernate или при отсутствии javassist в pom.xml . Что вы пробовали до сих пор? Какая версия Java, пытались ли вы переключить версию hibernate или добавить javassist в pom.xml ?

4. Вероятно, вы смешиваете jar-файлы из разных версий Hibernate, чего вам не следует делать. При этом ваш код также имеет недостатки: 1. вы должны использовать spring для управления фабрикой сеансов гибернации и 2. не создавайте контекст приложения для получения компонентов, в конечном итоге у вас закончится память и 3. этот код не является потокобезопасным.

5. Вы были правы. Проблема заключалась в версиях в pom.xml файл. Я изменил файл и, наконец, получил результат. Спасибо @DanyloGurianov и M. Deinum за вашу помощь.

Ответ №1:

Я решил эту проблему, добавив конструктор без аргументов. Если вы используете Lombok, вам нужно только добавить аннотацию @NoArgsConstructor:

 @AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
@EqualsAndHashCode
public class User {
    private Long userId;
    private String shortName;
}