有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java组织。冬眠所有物通道spi。PropertyAccessException:访问字段时出错

我刚开始使用hibernate 5,在向数据库添加1个对象时遇到问题。我试图找到原因,但还是找不到

hibernate配置文件hibernate。cfg。xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"/>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <mapping class="com.duan1.entity.AppUser"/>
    </session-factory>
</hibernate-configuration>

HibernateUtils类初始化SessionFactory

package com.duan1.utils;

import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateUtils {
    private static StandardServiceRegistry standardServiceRegistry;
    private static SessionFactory sessionFactory;

    static{
        if (sessionFactory == null) {
            try {
                // Create StandardServiceRegistry
                standardServiceRegistry = new StandardServiceRegistryBuilder()
                        .configure()
                        .build();
                // Create MetadataSources
                MetadataSources metadataSources = new MetadataSources(standardServiceRegistry);
                // Create Metadata
                Metadata metadata = metadataSources.getMetadataBuilder().build();
                // Create SessionFactory
                sessionFactory = metadata.getSessionFactoryBuilder().build();
            } catch (Exception e) {
                e.printStackTrace();
                if (standardServiceRegistry != null) {
                    StandardServiceRegistryBuilder.destroy(standardServiceRegistry);
                }
            }
        }
    }
    //Utility method to return SessionFactory
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

这是我的实体

package com.duan1.entity;
import lombok.*;
import javax.persistence.*;
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
@ToString
@Entity
@Table( name = "AppUser",
        uniqueConstraints = {
                 @UniqueConstraint(name = "appUser_email_unique",columnNames = "email"),
                 @UniqueConstraint(name = "appUser_phone_unique",columnNames = "phone"),
                 @UniqueConstraint(name = "appUser_username_unique",columnNames = "username")})
public class AppUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;
    @Column(name="username")
    private String username;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;
    @Column(name="phone")
    private String phone;
    @Column(name="name")
    private String name;
    @Column(name="address")
    private String address;
    @Column(name="avatar")
    private String avatar;
    @Column(name="role")
    @Enumerated(EnumType.STRING)
    private AppUserRole role;
    @Column(name="enable")
    private Boolean enable;

}

枚举角色

package com.duan1.entity;
        
        public enum AppUserRole {
            USER,
            ADMIN,
        }

如果保存到数据库,则会引发错误 包com。段1

import com.duan1.entity.AppUser;
import com.duan1.entity.AppUserRole;
import com.duan1.utils.HibernateUtils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CreateDB implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        try(Session session = HibernateUtils.getSessionFactory().openSession()) {
            session.beginTransaction();
            session.save(getUser());
            session.getTransaction().commit();
        } catch (HibernateException e) {
            e.printStackTrace();
        }
    }
    private AppUser getUser(){
        AppUser appUser = new AppUser();
        appUser.setUsername("abc");
        appUser.setAddress("ABCD");
        appUser.setPassword("12345");
        appUser.setRole(AppUserRole.USER);
        appUser.setEnable(true);
        appUser.setPhone("XXXXXXXXXXX");
        appUser.setEmail("sitien@gmail.com");
        appUser.setAvatar("/uploads/2.png");
        appUser.setName("ABCD");
        return appUser;
    }
}

错误

org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String com.duan1.entity.AppUser.address] by reflection for persistent property [com.duan1.entity.AppUser#address] : AppUser(id=null, username=abc, email=sitien@gmail.com, password=12345, phone=XXXXXXXXXXX, name=ABCD, address=ABCD, avatar=/uploads/2.png, role=USER, enable=true)
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:71)
    at org.hibernate.property.access.spi.GetterFieldImpl.getForInsert(GetterFieldImpl.java:86)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValuesToInsert(AbstractEntityTuplizer.java:619)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.getPropertyValuesToInsert(PojoEntityTuplizer.java:225)
    at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValuesToInsert(AbstractEntityPersister.java:4803)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:254)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:691)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:683)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:678)
    at com.duan1.CreateDB.run(CreateDB.java:17)
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:791)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:345)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332)
    at com.duan1.DemoApplication.main(DemoApplication.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field com.duan1.entity.AppUser.address to null value
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:393)
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:67)
    ... 27 more

共 (0) 个答案