JpaSystemException:通过持久属性[XXXXXX]的反射访问字段[XXXXXX]时出错:1



我对JPA/Hibernate还很陌生,所以我决定创建一个Library Rest应用程序来进行改进。我正试图用libraryId FK保存一个libraryCatalogItem,这样我就知道一个Library CatalogItem属于哪个库。

以下是我的LibraryCatalogItem.class:的大纲


import com.LibraryApplication.Library.model.Library;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.*;
//Created class abstract so this class can't be implemented
@Entity
//Implemented Single Table strategy for Hibernate Inheritance Mapping and used Discriminator values to identify different records
@DiscriminatorColumn(name = "library_catalog_item_type", discriminatorType = DiscriminatorType.STRING)
public abstract class LibraryCatalogItem {
@Id
@Column(name = "catalog_item_primary_key")
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer Id;

//declared private for encapsulation
@Getter
@Setter
protected String title, genre;
@JoinColumn(name = "library_fk"/*, nullable = false*/) //TODO uncomment nullable = false, once I figure out how to have foreign key
@ManyToOne(targetEntity = Library.class, cascade=CascadeType.ALL)
protected Integer libraryFk;
protected LibraryCatalogItem() {
}
@Override
public String toString() {
return "LibraryCatalogItem{" +
"title='" + title + ''' +
", genre='" + genre + ''' +
", id=" + Id +
'}';
}
}

这是我的图书馆课程:


import com.LibraryApplication.Library.model.LibraryCatalogItems.LibraryCatalogItem;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.List;
@Entity
public class Library {
@Id
@Column(name="library_primary_key")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
@Setter
protected Integer libraryPrimaryKey;
@Getter
@Setter
private Integer phoneNumber;
@Getter
@Setter
private String name, address, email;
//TODO make libraryId foreign key relate to LibraryCatalogItem Table
@OneToMany(mappedBy = "libraryFk", targetEntity = LibraryCatalogItem.class, fetch = FetchType.LAZY)
private List<LibraryCatalogItem> libraryCatalogItems;
}

我面临的问题是,当我发送保存库CatalogItem的请求时,我收到以下问题:

org.springframework.orm.jpa.JpaSystemException: Error accessing field [protected java.lang.Integer com.LibraryApplication.Library.model.Library.libraryPrimaryKey] by reflection for persistent property [com.LibraryApplication.Library.model.Library#libraryPrimaryKey] : 1; nested exception is org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [protected java.lang.Integer com.LibraryApplication.Library.model.Library.libraryPrimaryKey] by reflection for persistent property [com.LibraryApplication.Library.model.Library#libraryPrimaryKey] : 1] with root cause
java.lang.IllegalArgumentException: Can not set java.lang.Integer field com.LibraryApplication.Library.model.Library.libraryPrimaryKey to java.lang.Integer
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:na]
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:na]
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) ~[na:na]
at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) ~[na:na]

有人能为我指出解决这个问题的正确方向吗?非常感谢。

这并不能完全解决上述问题,但我最终采取了不同的方法,基本上达成了相同的解决方案。预期目标是通过在子实体表中包含libraryFk列来确保每个子实体都与库实体有关系。因此,我没有使用SingleTableHeritage映射,而是使用MappedSuperClassHeritation映射。

请参阅以下文章:https://www.baeldung.com/hibernate-inheritance

libraryPrimaryKey属性缺少@Getter和@Setter。我认为如果没有getter和setter,JPA将无法访问该属性。以下是有关它的一些信息:https://docs.oracle.com/cd/E19798-01/821-1841/bnbqb/index.html

"持久实例变量必须声明为私有、受保护或包私有,并且只能由实体类的方法直接访问。客户端必须通过访问器或业务方法访问实体的状态">

最新更新