[英]How to access reactive Panache Entity Session Manager from a websocket endpoint? (Quarkus, Mutiny, Panache, Reactive)
[英]How to properly batch insert using Quarkus reactive hibernate with panache
如何使用 Quarkus reactive hibernate 和 panache 正確批量插入?
我還沒有找到任何合適的文件,這是我失敗的嘗試:
@ReactiveTransactional
public Uni<List<KlineEntity>> persistAll(List<KlineEntity> klines) {
return getSession().onItem()
.transformToUni(session -> {
val batch = session.setBatchSize(BATCH_SIZE);
return Uni.createFrom().item(klines)
.onItem()
.call(entities -> batch.persistAll(entities))
.call(this::flush)
.invoke(session::clear);
});
}
結果是:
javax.persistence.PersistenceException: org.hibernate.HibernateException: java.util.concurrent.CompletionException: org.hibernate.MappingException: Unknown entity: java.util.ArrayList
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31)
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$firePersist$18(ReactiveSessionImpl.java:685)
at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
at java.base/java.util.concurrent.CompletableFuture.uniHandleStage(CompletableFuture.java:950)
at java.base/java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:2340)
at java.base/java.util.concurrent.CompletableFuture.handle(CompletableFuture.java:144)
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.firePersist(ReactiveSessionImpl.java:678)
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.reactivePersist(ReactiveSessionImpl.java:662)
at org.hibernate.reactive.util.impl.CompletionStages.applyToAll(CompletionStages.java:418)
at org.hibernate.reactive.mutiny.impl.MutinySessionImpl.lambda$persistAll$10(MutinySessionImpl.java:145)
at io.smallrye.context.impl.wrappers.SlowContextualSupplier.get(SlowContextualSupplier.java:21)
at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage.subscribe(UniCreateFromCompletionStage.java:24)
at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
at io.smallrye.mutiny.operators.uni.UniRunSubscribeOn.lambda$subscribe$0(UniRunSubscribeOn.java:27)
at org.hibernate.reactive.context.impl.VertxContext.execute(VertxContext.java:90)
at io.smallrye.mutiny.operators.uni.UniRunSubscribeOn.subscribe(UniRunSubscribeOn.java:25)
at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
at io.smallrye.mutiny.operators.uni.UniOnItemTransform.subscribe(UniOnItemTransform.java:22)
at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:81)
at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.forward(UniCreateFromKnownItem.java:38)
at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.access$100(UniCreateFromKnownItem.java:26)
at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem.subscribe(UniCreateFromKnownItem.java:23)
...
注意:我沒有在 application.yml 中設置任何特定內容,就像我對 hibernate JDBC 所做的那樣
這是我的實體的一部分是否有幫助:
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@Entity
@Table(name = "kline", schema = "binance", catalog = "trading", indexes = {
@Index(name = "idx_kline_pair_close_time_unq", columnList = "pair_id, closeTime", unique = true)
})
public class KlineEntity {
@Setter(NONE)
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Long id;
@OneToOne(cascade = {CascadeType.ALL}, orphanRemoval = true)
@JoinColumn(name = "pair_id")
@ToString.Exclude
private CurrencyPairEntity pair;
}
persistAll
接受 arrays,不列出:
@ReactiveTransactional
public Uni<List<KlineEntity>> persistAll(List<KlineEntity> klines) {
return getSession().chain(session -> session
.setBatchSize(BATCH_SIZE)
.persistAll(klines.toArray(new KlineEntity[klines.size()]))
)
.map(v -> klines);
}
因為它是事務性的,所以您不需要刷新或清除 session。
此外,Hibernate 禁用 IDENTITY 類型標識符的批處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.