#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
Я знаю, что эта ошибка возникает, когда он пытается найти получатели и установщики и не может их получить. Но я правильно проверил свои геттеры и сеттеры, они верны.
Пожалуйста, помогите мне с этим.
Моя структура такая
И код — это
- 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;
}
}
- 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();
}
}
- 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";
}
}
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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;
}