我正在使用 hibernate 将对象保存到数据库(mysql),但我不断收到此错误,这对我来说并没有真正意义,因为我有来自 @Data
的 getter 和 setter (也尝试过普通方式,同样的错误)
org.hibernate.property.access.spi.PropertyAccessException:
Error accessing field [private java.lang.String com.corona.models.User.email]
by reflection for persistent property [com.corona.models.User#email] :
User{id=0, email='asd@asd.asd', password='$2a$10$6lZ9wdyT.EyNXO5iIxfeeu9gX9hk8WAlwyykxQ9qIeZmyb3nKK4K6'}
at com.corona.dao.UserDao.saveEmployee(UserDao.java:18)
at com.corona.auth.AuthApplication.register(AuthApplication.java:28)
Caused by: java.lang.IllegalArgumentException: Can not set
java.lang.String field com.corona.models.User.email to com.corona.models.User
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
型号:
package com.corona.models;
import lombok.Data;
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 = "USERS")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "identity")
@Column(name = "id")
private int id;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@Override
public String toString() {
return "User{" +
"id=" + id +
", email='" + email + '\'' +
", password='" + password + '\'' +
'}';
}
}
配置:
<!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/coronaTime?useSSL=false</property>
<property name="connection.username">root</property>
<property name="connection.password">*******</property>
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.dbcp.initialSize">5</property>
<property name="hibernate.dbcp.maxTotal">20</property>
<property name="hibernate.dbcp.maxIdle">10</property>
<property name="hibernate.dbcp.minIdle">5</property>
<property name="hibernate.dbcp.maxWaitMillis">-1</property>
<mapping class="com.corona.models.User" />
</session-factory>
</hibernate-configuration>
保存方法:
public class UserDao {
private HibernateTemplate template;
public void saveEmployee(User u){
Transaction tx = null;
try {
var session= HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
session.save(u);
tx.commit();
} catch (Exception e) {
if( tx!=null) {
tx.rollback();
}
e.printStackTrace();
}
}
}
最佳答案
您需要有构造函数来保存 hibernate 对象。 请添加以下注释:
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@NoArgsConstructor(access = AccessLevel.PACKAGE)
(根据您的要求访问)
阅读此内容以获取解释: Why does Hibernate require no argument constructor?
关于java - Hibernate 5 PropertyAccessException : Error accessing field by reflection for persistent property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61478364/