【问题标题】:Hibernate/reflection issue in OneToMany relation: IllegalArgumentExceptionOneToMany 关系中的休眠/反射问题:IllegalArgumentException
【发布时间】:2019-05-09 03:21:10
【问题描述】:

当我尝试在 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。对我来说,它看起来非常像一个常见的休眠用例,唯一的“异常”可能是我在数据类上也有 lombok 注释。 我确信我忽略了一些非常简单的问题,但在过去的几天里是盲目的。

【问题讨论】:

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


    【解决方案1】:

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

    如果你没有设置@GeneratedValue注解,默认分配生成器,这意味着标识符的值必须由应用程序设置。

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

    【讨论】:

    • 阿米拉,感谢您的意见。我使用一个简单的标识符,也是因为我有时会从外部以 JSON 形式获取对象。它始终是一个 UUID,因此不需要由 JPA 生成它。如果我在没有链接的情况下保存 LawCase 或文档,它会起作用。但是当我在 Document 中设置了 lawcase 字段时,我收到了上述错误 - 但是两个对象的 id 字段已经存在。
    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多