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

Throw MappingException when entity/component class defines multiple matching getters by stem name

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 5.0.2
    • Fix Version/s: 5.0.3, 5.1.0
    • Component/s: hibernate-core
    • Labels:
      None
    • Environment:
      Hibernate ORM 5.0.2 Final, MySQL 5.6, Java 8
    • Bug Testcase Reminder (view):

      Bug reports should generally be accompanied by a test case!

    • Last commented by a user?:
      true
    • Sprint:

      Description

      In mapping XML, at the time of resolving a property name to a field or getter/setter method Hibernate does not yet know the type. So if the class defines multiple potential matches based solely on name, Hibernate will not be able to adequately decide between them. At the moment it just picks the first one it sees. Unfortunately different JVMs (even different versions from the same VM vendor) returns the methods in different orders.

      So if we (for example) match a property named active to a getter method named isActive, check that there is also not a method named getActive of differing type. If we do find such a getActive method, throw the MappingException.


      Original Description

      It is the same bug as HHH-10093, but for version 5.0.2. There you can find more information.

      Under Java 6 this does not happen, the exception is thrown when I use Java 8 (currently update 60).

      After I do a simple session.get(Class, Serializable) , when I call Transaction.commit():

      It reads all the properties in the xml order without problems. After it reads the last property, the call with the issue is made.

      So, in DefaultFlushEntityEventListener line 135

      final Object[] values = getValues(...);
      

      works fine.

      The issue appear on line 142

      if ( isUpdateNecessary( event, mightBeDirty ) ) {
      

      The owner object is of class Boolean with value false, instead of being an Articulo class.

      Exception
      org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of datos.Articulo.nroArticulo
      	at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:64)
      	at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:223)
      	at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4599)
      	at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4311)
      	at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:226)
      	at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:276)
      	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:455)
      	at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:281)
      	at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:291)
      	at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:296)
      	at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4079)
      	at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:532)
      	at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:215)
      	at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:142)
      	at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216)
      	at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85)
      	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:38)
      	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1224)
      	at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:464)
      	at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2894)
      	at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2270)
      	at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
      	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146)
      	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
      	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:230)
      	at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
      

        Attachments

          Issue links

            Activity

              People

              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:

                  Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - Not Specified
                  Not Specified
                  Logged:
                  Time Spent - 40m
                  40m