簡體   English   中英

如何使用 Quarkus reactive hibernate 正確批量插入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM