gpt4 book ai didi

java - 无法进行交易调用

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:25 24 4
gpt4 key购买 nike

在我的代码中,我将数据保存到 Microsoft SQL 数据库版本 10.50.4042.0我正在使用 hibernate-validator 版本 4.2.0.CR1 和 hibernate-commons-annotations 版本 3.2.0.Final

我正在处理由基于 Spring 框架的 Maven 连接的几个项目。在我的测试项目(使用 junit 4.8.2)中,我试图通过选择几个 xml 文件并将它们转换为数据库行来将数据保存到数据库中(一次一行)。在处理 SQL 事务的项目中,我使用此注释将数据发送到数据库

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)

我认为问题出在hibernate的Transactional进程中。但是没有异步调用,XML结构是完全有效的。我尝试了不同的方法,但问题似乎是随机发生的,没有任何特定模式,而且它无法仅保存 1 个随机数据行。

我得到的错误信息是:

2016-06-09 12:41:01,578: ERROR [http-8080-Processor3] Could not synchronize database state with session
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:47)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2574)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2478)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2805)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:114)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:180)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at com.sun.proxy.$Proxy48.save(Unknown Source)

没有其他 SQL 调用同时更新该行。如果你在 hibernate 中遇到同样的问题,你能帮忙吗?或者任何其他建议可能会有所帮助。谢谢

最佳答案

其实这个问题的意思是

  1. 找不到具有您给定 ID 的记录。为避免这种情况,如果我找到记录,我总是读取具有相同 ID 的记录,然后调用更新,否则抛出 “找不到异常记录”

  2. 您删除了一个对象,然后尝试更新它。在这种情况下,您需要清除 session session.clear();

实际答案:

id 属性的 Hibernate 映射文件中,如果您使用任何生成器类,则不应使用 setter 方法为该属性显式设置值。如果您明确设置 Id 属性的值,则会导致上述错误。检查此项以避免此错误。

调查程序:

但是,要更好地处理导致问题的原因,请尝试以下操作:

  1. 在您的 hibernate 配置中,将 hibernate.show_sql 设置为 true。这应该向您显示已执行并导致问题。
  2. 将 Spring 和 Hibernate 的日志级别设置为 DEBUG,同样会让您更好地了解是哪一行导致了问题。
  3. 创建一个单元测试,无需配置即可复制问题Spring 中的事务管理器。这应该会给你一个更好的主意有问题的代码行。

Solution:

在hibernate的save和saveOrupdate方法的不同场景下会出现这个Exception。

如果Object是transient的,需要保存可能会出现这个异常条件。

  1. 在提交对象之前刷新数据可能会导致清除所有等待持久化的对象。
  2. 如果对象具有自动生成的主键,而您强制分配键可能会导致异常。
  3. 如果在将对象提交到数据库之前清理对象可能会导致此异常。
  4. 零或不正确的 ID: Hibernate 除了主 ID 为空(保存时未初始化)之外,每点 2 表示对象未保存。如果您将 ID 设置为零或其他值,Hibernate 将尝试更新而不是插入,否则可能会抛出此异常。
  5. 对象不存在:这是最容易确定的:对象是否以某种方式被删除了?如果是这样,再次尝试删除将抛出此异常。

  6. 对象已过时:Hibernate 从 session 中缓存对象。如果对象被修改,而 Hibernate 不知道它,它会抛出这个异常——注意异常的 StaleStateException 部分。

所以在将对象提交到数据库之后需要flush or clear or clean it,而不是之前。

关于java - 无法进行交易调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727965/

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