Uploaded image for project: 'Spring Framework'
  1. Spring Framework
  2. SPR-14364

Hibernate 5 SpringSessionSynchronization calls Session.getFlushMode() directly instead of using SessionFactoryUtils.getFlushMode(session)

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Complete
    • Affects Version/s: 4.3 GA
    • Fix Version/s: 4.3.1
    • Component/s: Data:ORM
    • Labels:
    • Last commented by a User:
      true

      Description

      Hibernate 5.2.0 changed the method signature for Session.getFlushMode() so that it returns a javax.persistence.FlushModeType instead of a org.hibernate.FlushMode

      Spring 4.3.0 introduced several changes so that it could remain compatible with both 5.1.0 and 5.2.0 mainly by introducing indirection to obtain the Hibernate flush mode through SessionFactoryUtils.getFlushMode(session). However, this necessary change was omitted from SpringSessionSynchronization which still uses the following code snippet in beforeCommit():

      if (!session.getFlushMode().equals(FlushMode.MANUAL))

      { ... }

      which should now be:

      FlushMode flushMode = SessionFactoryUtils.getFlushMode(session);
      if (FlushMode.MANUAL.equals(flushMode)) { ... }

      This has critical consequences. Due to this bug, Spring 4.3.0 is not compatible with either Hibernate 5.1.0 nor 5.2.0

      When using Hibernate 5.1.0 this bug causes a java.lang.NoSuchMethodError due to the method signature change:

      java.lang.NoSuchMethodError: org.hibernate.Session.getFlushMode()Ljavax/persistence/FlushModeType;
      at org.springframework.orm.hibernate5.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:101)

      While in Hibernate 5.2.0 this causes javax.persistence.TransactionRequiredException due to equals(FlushMode.MANUAL) always returning false since it is comparing javax.persistence.FlushModeType vs org.hibernate.FlushMode

      javax.persistence.TransactionRequiredException: no transaction is in progress
      at org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3392)
      at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1385)
      at org.springframework.orm.hibernate5.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:104)

        Attachments

          Activity

            People

            • Assignee:
              juergen.hoeller Juergen Hoeller
              Reporter:
              mads1980 Manuel Dominguez Sarmiento
              Last updater:
              Spring Issuemaster
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:
                Days since last comment:
                47 weeks ago