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) 个答案