Hibernate Envers with @MapKey causes "PropertyAccessException: Error accessing field"

Viewed 105

I have the following entities:

@Entity
@Audited
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String guid;

    @OneToMany(mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true)
    @MapKey(name="fieldName")
    private Map<String, CustomField> customFields = new HashMap<>();
}


@Entity
@Audited
public class CustomField {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "field_name")
    @NotNull
    private String fieldName;

    @Column(name = "field_value")
    @NotNull
    private String fieldValue;

    @ManyToOne(fetch = FetchType.LAZY, optional = false, targetEntity= Item.class)
    @JoinColumn(name = "item_guid", referencedColumnName = "guid")
    private Item item;
}

When I try to add a new CustomField to an Item that has some already like so:

Item item = new Item();
item.setGuid(UUID.randomUUID().toString());

Transaction tx = session.beginTransaction();
Serializable id = session.save(item);
tx.commit();

CustomField field = new CustomField();
field.setFieldName("test_field");
field.setFieldValue("test");
field.setItem(item);
item.getCustomFields().put(field.getFieldName(), field);

Transaction tx2 = session.beginTransaction();
session.persist(item);
tx2.commit();


Transaction tx3 = session.beginTransaction();
Item item2 = session.get(Item.class, id);
CustomField field2 = new CustomField();
field2.setFieldName("test_field_2");
field2.setFieldValue("test_2");
field2.setItem(item2);
item.getCustomFields().put(field2.getFieldName(), field2);
session.persist(item2);
tx3.commit();

It results in the following error:

javax.persistence.PersistenceException: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String org.hibernate.envers.bugs.Item.guid] by reflection for persistent property [org.hibernate.envers.bugs.Item#guid] : test_field

    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1463)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:514)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3321)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2492)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)
    at org.hibernate.envers.bugs.EnversUnitTestCase.hhh123Test(EnversUnitTestCase.java:93)
    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:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    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$CallableStatement.call(FailOnTimeout.java:298)
    at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String org.hibernate.envers.bugs.Item.guid] by reflection for persistent property [org.hibernate.envers.bugs.Item#guid] : test_field
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:75)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:59)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:65)
    at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:90)
    at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:436)
    at org.hibernate.type.ComponentType.isSame(ComponentType.java:165)
    at org.hibernate.envers.internal.entities.mapper.relation.MapCollectionMapper.isSame(MapCollectionMapper.java:128)
    at org.hibernate.envers.internal.entities.mapper.relation.MapCollectionMapper.mapCollectionChanges(MapCollectionMapper.java:156)
    at org.hibernate.envers.internal.entities.mapper.relation.AbstractCollectionMapper.mapCollectionChanges(AbstractCollectionMapper.java:147)
    at org.hibernate.envers.internal.entities.mapper.MultiPropertyMapper.mapCollectionChanges(MultiPropertyMapper.java:256)
    at org.hibernate.envers.event.spi.BaseEnversCollectionEventListener.generateFakeBidirecationalRelationWorkUnits(BaseEnversCollectionEventListener.java:204)
    at org.hibernate.envers.event.spi.BaseEnversCollectionEventListener.onCollectionAction(BaseEnversCollectionEventListener.java:68)
    at org.hibernate.envers.event.spi.BaseEnversCollectionEventListener.onCollectionActionInversed(BaseEnversCollectionEventListener.java:123)
    at org.hibernate.envers.event.spi.EnversPreCollectionUpdateEventListenerImpl.onPreUpdateCollection(EnversPreCollectionUpdateEventListenerImpl.java:37)
    at org.hibernate.action.internal.CollectionUpdateAction.preUpdate(CollectionUpdateAction.java:111)
    at org.hibernate.action.internal.CollectionUpdateAction.execute(CollectionUpdateAction.java:57)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1457)
    ... 24 more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field org.hibernate.envers.bugs.Item.guid to java.lang.String
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:393)
    at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:71)
    ... 44 more

I am using Hibernate (and Envers) version 5.4.0.Final. Any pointers appreaciated.

0 Answers
Related