We're updating the issue view to help you get more done. 

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

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

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

works fine.

The issue appear on line 142

1 if ( isUpdateNecessary( event, mightBeDirty ) ) {

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

Exception

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 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)

Environment

Hibernate ORM 5.0.2 Final, MySQL 5.6, Java 8

Status

Assignee

Steve Ebersole

Reporter

IvanRF

Fix versions

Labels

None

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Components

Affects versions

5.0.2

Priority

Major