如何坚持使用休眠反应式和复杂 id?

How to persist with hibernate-reactive and complex id?

提问人:MiKa 提问时间:11/9/2023 更新时间:11/9/2023 访问量:28

问:

当我想坚持使用Hibernate-reactive(hibernate-reactive-core 2.0.6.Final)&spring-boot和java17时,我有一个错误。

我的实体 :

import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;

@Table(name = "MY_TABLE")
@Entity
@IdClass(MyTableId.class)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MyTableEntity {

    @Id
    @Column(name = "CODE_1")
    private String code1;

    @Column(name = "NUM")
    private Long num;

    @Id
    @Column(name = "CODE_2")
    private String code2;

    @Id
    @Column(name = "DATE")
    private LocalDateTime date;
}

类 ID :

@AllArgsConstructor
@NoArgsConstructor
@Data
public class MyTableId implements Serializable {
    private String code1;
    private String code2;
    private LocalDateTime date;
}

我的存储库:

@Repository
@AllArgsConstructor
public class MyTableRepository {

    private Stage.SessionFactory sessionFactory;

    public Mono<Void> save(MyTableEntity myTableEntity) {
        return Mono.fromCompletionStage(
                sessionFactory.withSession(
                    session -> session.persist(myTableEntity)
                ));
    }

// ... others methods to find in MyTable

但是当我调用session.persist时出现错误:

java.util.concurrent.CompletableFuture@68e22cdc[异常完成:java.util.concurrent.CompletionException:org.hibernate.HibernateException:java.util.concurrent.CompletionException:org.hibernate.property.access.spi.PropertyAccessException:通过持久属性 [myPackageEntity#code2] 的反射访问字段 [private java.lang.String myPackage.MyTableEntity.code2] 时出错:MyTableEntity(code1=CODE_1, num=3, code2=ABCD1234, date=2023-11-08T21:21:39.835527200 ... ... ... ... ... 原因:java.lang.IllegalArgumentException:无法将 java.lang.String 字段 myPackage.MyTableEntity.code2 设置为 myPackage.MyTableEntity 在 java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)

有关信息,我还有另外两种方法可以找到实体并且它们可以工作......例如:

public Mono<MyTableEntity> findBlablabla(String code1) {
        return Mono.fromCompletionStage(
                sessionFactory.withSession(
                        session ->
                                session
                                        .createQuery("""
                                                        SELECT m from MyTableEntity m
                                                        WHERE c.code1 like :code1
                                                        ORDER BY c.date DESC
                                                        LIMIT 1
                                                        """
                                                , MyTableEntity.class)
                                        .setParameter("code1", code1)
                                        .getSingleResultOrNull()
                )
        );
    }

有什么想法吗?谢谢。

java 编程 冬眠反应式

评论


答:

0赞 RichardFeynman 11/9/2023 #1

您是否尝试过为这些私有字段创建 getter 和 setter?

文档中:

1.3.2. getter 和 setter 在 Quarkus 环境之外使用 Hibernate Reactive 时,您需要编写实体类 根据通常的 JPA 约定,它要求:

持久属性的私有字段,以及

一个 nullary 构造函数。

评论

0赞 MiKa 11/9/2023
是的,我尝试了龙目岛的@Data,并尝试了生成的 getter/setter。什么都没有改变:(