Hibernate 5 PropertyAccessException: Ошибка при доступе к полю при отражении для постоянного свойства - PullRequest
0 голосов
/ 28 апреля 2020

Я использую hibernate, чтобы сохранить объект в БД (mysql), но я продолжаю получать эту ошибку, которая на самом деле не имеет смысла для меня, так как у меня есть геттеры и сеттеры от @Data (также пробовал с ванильный путь, та же ошибка)

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();
        }
    }

}

1 Ответ

0 голосов
/ 28 апреля 2020

Вам нужны конструкторы для сохранения спящего объекта. Пожалуйста, добавьте следующие аннотации:

@AllArgsConstructor(access = AccessLevel.PACKAGE)
@NoArgsConstructor(access = AccessLevel.PACKAGE)

(доступ в соответствии с вашими требованиями)

Прочтите это для объяснения: Почему Hibernate не требует конструктора аргументов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...