当我尝试在 n 侧保存一个在 1 侧设置了该对象的对象时,收到以下错误:
Dec 07, 2018 10:37:07 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: Error accessing field [public java.lang.String eu.jaas.document.Document.id] by reflection for persistent property [eu.jaas.document.Document#id] : 17842965-4ea8-41b6-9653-110965f6db13; nested exception is org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [public java.lang.String org.myorg.document.Document.id] by reflection for persistent property [org.myorg.document.Document#id] : doc123] with root cause
java.lang.IllegalArgumentException: Can not set java.lang.String field eu.jaas.document.Document.id to java.lang.String
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
1-side Java 对象定义如下:
@Entity
public class LawCase {
..
@Id
public String id;
@OneToMany(mappedBy = "lawcase")
public @Setter Set<Document> documents = new HashSet<>();
..
}
n 面:
@Entity
public class Document {
..
@Id
public String id;
@ManyToOne
@JoinColumn(name="lawcase")
public LawCase lawcase;
..
}
ID 是在对象初始化期间由应用程序本身生成的,因此当我尝试保存对象时,LawCase 和 Document 对象都有一个有效的 id (UUID)。
我使用 springBoot.version 2.1.1.RELEASE 并尝试使用 Java8 和 Java11。对我来说,它看起来非常像一个常见的 hibernate 用例,唯一的“异常”可能是我在数据类上也有 lombok 注释。 我确信我忽略了一些非常简单的问题,但最近几天却盲目了。
最佳答案
默认 ID GenerationType 为 AUTO。但问题是这个 GenerationType 不支持字符串。该GenerationType支持long、int和short数据类型。
如果没有设置@GenerateValue注解,则默认分配生成器,这意味着标识符的值必须由应用程序设置。
如果您可以使用自定义 GenerationType 解决此错误。您可以引用here
关于java - OneToMany 关系中的 Hibernate/反射问题 : IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53668169/