Uploaded image for project: 'Hibernate ORM'
  1. HHH-11117

LazyPropertyInitializer$1 cannot be cast to [B when calling Session.merge() on compile time enhanced composed entities

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Out of Date
    • Affects versions: 4.2.21, 5.2.1, 5.2.2
    • Fix versions: 5.2.13
    • Components: hibernate-core
    • Environment:

      Description

      Hello,

      Following my observations from link I open this ticket as instructed on same topic.

      Basically I have 2 Hibernate persistent entities Company, Manager ("has a" relationship).
      Manager.resume is annotated with (@Basic(fetch = FetchType.LAZY)). Both entity classes are compile time instrumented by org.hibernate.orm.tooling:hibernate-enhance-maven-plugin.

      At runtime during the transactional/Hibernate session scope:

      • create new instance Company/Manager
      • assemble them (they are still transient)
      • try to call session.merge(company). Following this I get the error below.
        The use case can be reproduced with the attached test case.
      java.lang.ClassCastException: org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer$1 cannot be cast to [B
      	at org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor.areEqual(PrimitiveByteArrayTypeDescriptor.java:26)
      	at org.hibernate.type.AbstractStandardBasicType.isEqual(AbstractStandardBasicType.java:195)
      	at org.hibernate.type.AbstractStandardBasicType.getReplacement(AbstractStandardBasicType.java:75)
      	at org.hibernate.type.AbstractStandardBasicType.replace(AbstractStandardBasicType.java:361)
      	at org.hibernate.type.TypeHelper.replace(TypeHelper.java:211)
      	at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:430)
      	at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:232)
      	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:172)
      	at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:881)
      	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:848)
      	at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:261)
      	at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:391)
      	at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:316)
      	at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:155)
      	at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:104)
      	at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:445)
      	at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:238)
      	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:172)
      	at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:68)
      	at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:857)
      	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:838)
      	at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:843)
      	at org.hibernate.bugs.ORMUnitTestCase.hhh123Test(ORMUnitTestCase.java:88)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
      	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
      	at org.hibernate.testing.junit4.ExtendedFrameworkMethod.invokeExplosively(ExtendedFrameworkMethod.java:45)
      	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
      	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
      	at org.junit.internal.runners.statements.FailOnTimeout$StatementThread.run(FailOnTimeout.java:74)
      

      As I said in the post, by debugging and checking your github fixes for hibernate 4.x on same error:
      Maybe a solution would be to modify the following method ? org.hibernate.type.TypeHelper.replace(Object[], Object[], Type[], SharedSessionContractImplementor, Object, Map, ForeignKeyDirection))

      by adding a condition like you did when fixing the other

      else if ( target[i] == LazyPropertyInitializer.UNFETCHED_PROPERTY ) {
                  if ( types[i].isMutable() ) {
                     copied[i] = types[i].deepCopy( original[i], session.getFactory() );
                  }
                  else {
                     copied[i] = original[i];
                  }
               }
      

      just as you did with the other one: org.hibernate.type.TypeHelper.replace(Object[], Object[], Type[], SharedSessionContractImplementor, Object, Map) in pull 891 https://github.com/hibernate/hibernate-orm/pull/891/files

      I think this method is called for MyEntity properties (org.hibernate.type.TypeHelper.replace(Object[], Object[], Type[], SharedSessionContractImplementor, Object, Map, ForeignKeyDirection))) because I am persisting MyEntity indirectly through a parent entity MyContainerEntity (one-to-one relation, MyEntity being the owning side).

      So the particularity of this case is that that a child entity fails to get merged through a parent entity. The child entity is compile time instrumented and has a LAZY Basic attribute/property.

      Thanks in advance for looking

        Attachments

          Issue links

            Activity

              People

              • Votes:
                4 Vote for this issue
                Watchers:
                6 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: