将学生对象保存在CreateStudentDemo.class中时,出现信息:HHH10001008:清理连接池[jdbc:mysql:// localhost:3306 / hb_student_tracker?useSSL = false&serverTimezone = UTC] 线程“主” org.hibernate.PropertyAccessException中的异常: 无法通过反射设置字段值[POST_INSERT_INDICATOR]的值 :[类com.luvjava.hibernate.demo.entity.Student.id]的设置 com.luvjava.hibernate.demo.entity.Student.id位于 org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:72) 在 com.luvjava.hibernate.demo.CreateStudentDemo.main(CreateStudentDemo.java:33) 引起原因:java.lang.IllegalArgumentException:无法设置int字段 com.luvjava.hibernate.demo.entity.Student.id至 org.hibernate.id.IdentifierGeneratorHelper $ 2
错误
CreateStudentDemo.class
package com.luvjava.hibernate.demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.luvjava.hibernate.demo.entity.Student;
public class CreateStudentDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//create session factory
SessionFactory factory=new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Student.class)
.buildSessionFactory();
//create session object
Session session=factory.getCurrentSession();
System.out.println("before try block");
//save object
try {
//begin transaction
session.beginTransaction();
System.out.println("Creating student object..");
//create object
Student theStudent=new Student("Ravisher","Singh","rvsingh3213@gmail.com");
//save object
System.out.println("Saving Student Object...");
session.save(theStudent); **This is line from where exception starts**
System.out.println(" afterSaving Student Object...");
//commit changes
session.getTransaction().commit();
System.out.println("commit Done");
}
finally {
session.flush();
session.close();
factory.close();
}
}
}
这是实体类
package com.luvjava.hibernate.demo.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Id
@Column(name="first_Name" )
private String firstName;
@Id
@Column(name="last_Name")
private String lastName;
@Id
@Column(name="email")
private String email;
public Student() {
System.out.println("In default constructor");
}
//Constructor using fields
public Student(String firstName, String lastName, String email) {
System.out.println("arg constructor.");
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
}
}
这将是hibernate.cfg.xml
<!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.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hb_student_tracker?useSSL=false&serverTimezone=UTC</property>
<property name="connection.username">hbstudent</property>
<property name="connection.password">hbstudent</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>
答案 0 :(得分:0)
您的实体类中仅需要一个@Id注释 这是您实体的外观
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="first_Name" ) <--- first_Name, this value MUST MATCH WITH WHAT YOU HAVE IN YOUR DATABASE
private String firstName;
@Column(name="last_Name")<--- last_Name, this value MUST MATCH WITH WHAT YOU HAVE IN YOUR DATABASE
private String lastName;
@Column(name="email")
private String email;
public Student() {
System.out.println("In default constructor");
}
//Constructor using fields
public Student(String firstName, String lastName, String email) {
System.out.println("arg constructor.");
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
}
}