使用 PanacheEntityResource 进行软删除会导致 OptimisticLockException

Soft-Delete with PanacheEntityResource results in OptimisticLockException

提问人:onigunn 提问时间:11/16/2023 更新时间:11/16/2023 访问量:18

问:

我想在我的quarkus原型上实现一个软删除机制。给定此实体

@Entity
@Table(name = "categories")
@SQLDelete(sql = "UPDATE categories SET deleted_at = now() WHERE id = ?", check = ResultCheckStyle.COUNT)
@Where(clause = "deleted_at IS NULL")
public class Category extends PanacheEntity {
    public String title;
    @ManyToOne
    public Category parent;
    @UpdateTimestamp
    @Column(name = "updated_at")
    public Date updatedAt;
    @CreationTimestamp
    @Column(name = "created_at", updatable = false)
    public Date createdAt;
    @Column(name = "deleted_at")
    public Date deletedAt;
}

Hibernate 正确地拾取了 和 注解,如日志中所示。@Where@SQLDelete

PanacheEntityResource

@ResourceProperties(path = "r-categories")
public interface CategoryREST extends PanacheEntityResource<Category, Long> {

}

所有方法都工作正常,除此之外,还会抛出下面的详细堆栈跟踪GET,POST,PUTDELETEjakarta.persistence.OptimisticLockException

2023-11-16 15:02:56,857 WARN  [io.qua.hib.orm.res.dat.pan.run.RestDataPanacheExceptionMapper] (executor-thread-1) Mapping an unhandled RestDataPanacheException: io.quarkus.rest.data.panache.RestDataPanacheException: Failed to delete an entity
        at org.acme.CategoryRESTJaxRs_e79be3c94f0cad9f226867ba6e8d90914e10ca85.delete(Unknown Source)
        at org.acme.CategoryRESTJaxRs_e79be3c94f0cad9f226867ba6e8d90914e10ca85$quarkusrestinvoker$delete_51d77e39c8d2bf28511a9aae7f6a80b42eb0edb7.invoke(Unknown Source)
        at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
        at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
        at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
        at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:582)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: io.quarkus.arc.ArcUndeclaredThrowableException: Error invoking subclass method
        at org.acme.CategoryRESTImpl_e79be3c94f0cad9f226867ba6e8d90914e10ca85_Subclass.delete(Unknown Source)
        at org.acme.CategoryRESTImpl_e79be3c94f0cad9f226867ba6e8d90914e10ca85_ClientProxy.delete(Unknown Source)
        ... 12 more
Caused by: jakarta.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
        at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1283)
        at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:104)
        at io.quarkus.narayana.jta.runtime.NotifyingTransactionManager.commit(NotifyingTransactionManager.java:70)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.endTransaction(TransactionalInterceptorBase.java:406)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:171)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:107)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:38)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:61)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:32)
        at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired_Bean.intercept(Unknown Source)
        at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
        at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:30)
        at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:27)
        ... 14 more
Caused by: jakarta.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [org.acme.domain.entity.Category#2]
        at org.hibernate.internal.ExceptionConverterImpl.wrapStaleStateException(ExceptionConverterImpl.java:204)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:93)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
        at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:168)
        at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1416)
        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:485)
        at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2301)
        at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:1966)
        at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:439)
        at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.beforeCompletion(JtaTransactionCoordinatorImpl.java:336)
        at org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:47)
        at org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:37)
        at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:52)
        at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:351)
        at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:69)
        at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:138)
        at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1271)
        ... 26 more


鉴于休眠正在工作,这可能是一个与华丽相关的错误?

java hibernate quarkus quarkus-panache

评论


答: 暂无答案