The reason that Hibernate logged the ERROR level log when StaleStateException occurs while using batch_size option

Hi, I’m getting a lot of help from Hibernate. Thank you. :hugs:

I have a question while using Hibernate,

First, the following error occurred, so I looked up the reason.

[2022-05-09 09:47:22][http-nio-10741-exec-7] ERROR o.h.e.j.batch.internal.BatchingBatch - HHH000315: Exception executing batch [org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: /* update FooEntity */ update `Foo` set `updated_at`=?, `subject_enc`=?, `version`=? where `foo_id`=? and `version`=?], SQL: /* update FooEntity */ update `Foos` set `updated_at`=?, `subject_enc`=?, `version`=? where `foo_id`=? and `version`=?

When project uses hibernate.jdbc.batch_size option and occurs StaleStateException (if updating Foo from different threads at the same time), the above ERROR message is logged. But when I remove that option, ERROR is not logged.

So I checked the code and found the cause.

  1. Using batch_size
  • After StaleStateException occurred, LOG.unableToExecuteBatch() method is invoked and throw the other Exception.
  • image
  1. Disable batch_size
  • After StaleStateException occurred, just throw the other Exception. (Don’t log ERROR log)

Finally, this is my question. I wonder why it depends on the batch_size option even though same situation. Is there a more significant problem when exception occurs while using that option?

Project properties are like this. (Let me know if you need more.)

  • spring-boot 2.5.12
  • hibernate-core 5.4.33
  • application.yml
        allow-bean-definition-overriding: true
        open-in-view: false
            physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
            globally_quoted_identifiers: true
              in_clause_parameter_padding: true
              batch_size: 500
              order_inserts: true

I’ll be waiting for the reply.
Thanks :smile:

Are you sure that no exception is logged when you disable batching? The fact that we are logging the error in the batching doesn’t change that the exception is still thrown to the caller, so you will see the exception regardless. I don’t know why Hibernate explicitly logs batching errors, but I guess maybe to provide an explicit hint, that the error could be batching related.