带有@MapKey的Hibernate Envers导致“ PropertyAccessException:访问字段时出错”

问题描述

我有以下实体:

function equal(a,b,c){ 
  return a==b && b==c;
}

当我尝试将新的@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; } 添加CustomField时,已经有些像这样了:

Item

它导致以下错误

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();

我正在使用Hibernate(和Envers)版本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 。所有指针均已确定。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...