gpt4 book ai didi

java - 由于新的 HashSet,Spring Hibernate StaleObjectStateException?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:38 25 4
gpt4 key购买 nike

我的代码在很长一段时间内都运行良好,但经过几次重构后,我发现我突然无法再保存 Group 对象了。

我遇到了可怕的 Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) 错误。在谷歌搜索之后,我当然找到了 this StackOverflow question ,但它对我没有任何帮助,因为我没有同时做任何事情。

经过我的重构后,我发现的唯一区别就是这个变化。

之前是:

    final Collection<Sample> allByBarcode = sampleService.byBarcode(groupRequest.getSamples(), currentUser);

if (!allByBarcode.isEmpty()) {
Group group = new Group();

group.setName(groupRequest.getName());
group.setSamples(allByBarcode);
group.setType(groupRequest.getType());
group.setOwner(currentUser);

group = repository.save(group);

return Optional.ofNullable(group);
}

重构后(不记得具体原因)变成了:

    final Collection<Sample> allByBarcode = sampleService.byBarcode(groupRequest.getSamples(), currentUser);

if (!allByBarcode.isEmpty()) {
Group group = new Group();

group.setName(groupRequest.getName());
group.setSamples(new HashSet<>(allByBarcode));
group.setType(groupRequest.getType());
group.setOwner(currentUser);

group = repository.save(group);

return Optional.ofNullable(group);
}

改回原来的后,突然又开始了,每次都没有任何错误。

任何人都可以解释这个错误的原因是什么,因为这实际上是使它再次工作的代码中唯一的区别?

更新 1:

我尝试了另一种变体:

Group group = new Group();

group.setName(groupRequest.getName());
group.setSamples(new ArrayList<>(allByBarcode));
group.setType(groupRequest.getType());
group.setOwner(currentUser);

group = repository.save(group);

请注意 ArrayList 而不是 HashSet - 由于某些原因,此代码有效

我也尝试过LinkedList,它也有效

有什么想法吗?

更新 2:

堆栈跟踪如下:我已将其删除以删除大量与 Spring 和 Tomcat 相关的痕迹。

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [uk.ac.sanger.mig.aker.domain.Group] with identifier [93]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [uk.ac.sanger.mig.aker.domain.Group#93]] with root cause

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [uk.ac.sanger.mig.aker.domain.Group#93]
at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2541)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3285)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3183)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3525)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:159)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:521)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy116.createGroup(Unknown Source)
at uk.ac.sanger.mig.aker.controllers.GroupController.store(GroupController.java:107)

最佳答案

在您的新代码中,您正在创建一个新的 HashSet,它将包含 allByBarcode 集合中的所有 Sample 元素。

我认为这里提出了问题,因为这些元素没有被 session 持久化,因为它们是添加到 new HashSet() 实例的新对象,并且它们并没有真正被 session 保存,它解释了 Row 被另一个事务更新或删除(或未保存的值映射不正确) Exception 但是 allByBarcode 元素取自您的服务,以便它们被 session 持久化识别

而且我不明白设置一个新的 HashSet 实例的必要性是什么,其中元素应该由 session 保存(持久化)(这将抛出一个 Exception因为您正在尝试使用现有标识符保存元素),而设置已保存的元素更高效、更安全,因此更好地使用:

   group.setSamples(allByBarcode);

关于java - 由于新的 HashSet,Spring Hibernate StaleObjectStateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29673003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com