提问人:MiKa 提问时间:11/9/2023 更新时间:11/9/2023 访问量:28
如何坚持使用休眠反应式和复杂 id?
How to persist with hibernate-reactive and complex id?
问:
当我想坚持使用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()
)
);
}
有什么想法吗?谢谢。
答:
您是否尝试过为这些私有字段创建 getter 和 setter?
从文档中:
1.3.2. getter 和 setter 在 Quarkus 环境之外使用 Hibernate Reactive 时,您需要编写实体类 根据通常的 JPA 约定,它要求:
持久属性的私有字段,以及
一个 nullary 构造函数。
评论