OneToMany关系中的休眠/反射问题:IllegalArgumentException

时间:2018-12-07 11:00:02

标签: java hibernate spring-boot reflection hibernate-onetomany

当我尝试在对象的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面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。在我看来,这非常像一个常见的休眠用例,唯一的“异常”可能是我在数据类上也有lombok批注。 我确定我忽略了一个非常简单的问题,但是最近几天是盲目的。

1 个答案:

答案 0 :(得分:0)

默认ID GenerationType为AUTO。但问题是此GenerationType不支持字符串。该GenerationType支持long,int和short数据类型。

如果未设置@GeneratedValue批注,则会为默认值分配生成器,这意味着应用程序必须设置标识符的值。

如果可以使用自定义GenerationType解决此错误。您可以参考here